R - 根据列中的信息划分为较小的数据帧

时间:2014-02-08 13:59:58

标签: r string sorting divide

假设我有一个制表符分隔的文件fileA.txt,其中包含以下几种类型的信息:

X         123       78000    0        romeo 
X         78000     78004    56       juliet    
Y         78004     78005    12       mario
Y         78006     78008    21       mario   
Y         78008     78056    8        luigi 
Z         123       78000    1        peach 
Z         78000     78004    24       peach    
Z         78004     78005    4        peach
A         78006     78008    12       zelda   
A         78008     78056    14       zelda

我将此数据框保存到变量中,如下所示:

df <- read.table("fileA.txt",sep="\t",colClasses=c("character","numeric","numeric","numeric","character"))
colnames(df) <- c("location","start","end","value","label")

我们假设我不知道第一列df[,1]中包含多少个不同的字符串,并将此号码称为n。我想自动生成n个新数据框,每个数据框包含单一类型字符串的信息。我该如何为此编写函数?

3 个答案:

答案 0 :(得分:4)

您可以使用拆分执行此操作,这将返回list,其中包含以您拆分的每个级别命名的data.frame

df <- data.frame(v = rep(1:10, 2), n = rep(letters[1:10], 2))
split(df, df$n)

答案 1 :(得分:2)

可能你需要:

library(plyr)
out <- llply(unique(df[,1]), function(x) subset(df, df[,1]==x))
out

它会创建list,其中每个元素都是data.frame,具有特定的location

现在,您可以data.frames访问out[[1]]

如果你想保留姓名:

names(out) <- unique(df[,1])
out$X # gives data.frame with location=='X'

答案 2 :(得分:2)

for (x in unique(df[, 1]))
  assign(paste("df", x, sep="_"), df[df[, 1] == x, ])

list2env(split(df, df$location), environment())