按变量拆分data.frame

时间:2013-09-20 09:38:02

标签: r dataframe

我将来自多个主题的数据存储在单个CSV文件中。导入CSV文件后,我想将每个参与者的数据拆分为自己的data.frame。

更确切地说,我想采用下面的示例数据,并创建三个新的data.frames;每个'subject_initials'值都有一个。

enter image description here

我该怎么做?到目前为止,我已使用plyr包和split()查看选项,但尚未找到解决方案。我知道我可能错过了一些明显的东西。

2 个答案:

答案 0 :(得分:11)

split是通用的。 split.default非常快,split.data.frame在分割的级别数增加时变得非常慢。

备用(更快)解决方案是使用data.table。我将在这里说明更大数据的差异:

示例数据(@Roland在评论中指的是什么)

require(data.table)
set.seed(45)
DF <- data.frame(ids = sample(1e4, 1e6, TRUE), x = sample(letters, 1e6, TRUE), 
                  y = runif(1e6))
DT <- as.data.table(DF)

功能+基准测试

请注意,数据的顺序在此处会有所不同,因为“ids”分组排序。如果您需要,可以先setkey(DT, ids)然后运行f2

f1 <- function() split(DF, DF$ids)
f2 <- function() {
    ans <- DT[, list(list(.SD)), by=ids]$V1
    setattr(ans, 'names', unique(DT$ids)) # sets names by reference, no copy here.
}

require(microbenchmark)
microbenchmark(ans1 <- f1(), ans2 <- f2(), times=10)

# Unit: milliseconds
#          expr        min         lq     median         uq       max neval
#  ans1 <- f1() 37015.9795 43994.6629 48132.3364 49086.0926 63829.592    10
#  ans2 <- f2()   332.6094   361.1902   409.2191   528.0674  1005.457    10

split.data.frame平均 48秒data.table 0.41秒

答案 1 :(得分:7)

split似乎在这里合适。

如果您从以下数据框开始:

df <- data.frame(ids=c(1,1,2,2,3),x=1:5,y=letters[1:5])

然后你可以这样做:

split(df, df$ids)

您将获得一个数据框列表:

R> split(df, df$ids)
$`1`
  ids x y
1   1 1 a
2   1 2 b

$`2`
  ids x y
3   2 3 c
4   2 4 d

$`3`
  ids x y
5   3 5 e