我将来自多个主题的数据存储在单个CSV文件中。导入CSV文件后,我想将每个参与者的数据拆分为自己的data.frame。
更确切地说,我想采用下面的示例数据,并创建三个新的data.frames;每个'subject_initials'值都有一个。
我该怎么做?到目前为止,我已使用plyr
包和split()
查看选项,但尚未找到解决方案。我知道我可能错过了一些明显的东西。
答案 0 :(得分:11)
split
是通用的。 split.default
非常快,split.data.frame
在分割的级别数增加时变得非常慢。
备用(更快)解决方案是使用data.table
。我将在这里说明更大数据的差异:
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