【发布时间】:2015-03-27 10:11:29
【问题描述】:
我以为我有一个非常简单的数据框转换,但由于某种原因,我无法理解它似乎需要很长时间,这让我怀疑它可能没有达到我的预期。有人能解释一下吗?
第 1 部分 - 将源数据转换为单独的列(实际 df 有 260 万行)。
鉴于...
> V1 <- c("E11 2286 1", "ECAT 2286 1", "M11 2286 1", "M12 2286 1", "MCAT 2286 1", "C24 2287 1")
> df <- data.frame(V1)
> df
V1
1 E11 2286 1
2 ECAT 2286 1
3 M11 2286 1
4 M12 2286 1
5 MCAT 2286 1
6 C24 2287 1
我想创建两个新列(itemID 和主题),并用 V1 中相应行的 substr 填充每一列。
这个我可以用;
> require(stringr)
> df$itemID <- sapply(1:nrow(df), function(i) str_split(df[i,"V1"]," ")[[1]][[2]] )
> df$topic <- sapply(1:nrow(df), function(i) str_split(df[i,"V1"]," ")[[1]][[1]] )
但这需要几分钟,似乎应该有更有效的方法。所以首先我尝试使用 sapply;
> sapply(1:nrow(df), function(i) {
t <- str_split(df[i,"V1"]," ")
df$itemID <- t[[1]][[2]]
df$topic <- t[[1]][[1]]
})
一个多小时后,什么都没有。所以我放弃了,因为当单个命令需要不到 20 分钟时,这显然无济于事。
下一个选项是在单个任务上尝试 ddply,但也失败了。
> require(plyr)
> require(stringr)
> df$itemID <- ddply(df, .(V1), str_split(df$V1," ")[[1]][[2]], .progress="text" )
Error in get(as.character(FUN), mode = "function", envir = envir) :
object '2286' of mode 'function' was not found
所以对于这个任务的第一部分,任何人都可以;
- i) 告诉我哪种方法可能更快(sapply 或 ddply),并且
- ii) 使用该方法提供了关于如何将列 V1 拆分为两个必需的组件列的解决方案?
第 2 部分 - 为 itemID 收集所有主题 对于奖励积分...我需要的任务的第二部分是获取 260 万行(现在为 3 列)并折叠每一行以获取 itemID,以便所有主题都保存在一个单元格中。
输出最终应该看起来像...
itemID topic
1 2286 E11,ECAT,M11,M12,MCAT
2 2287 C24
谁能建议一种简单的方法将这样的行聚集到一个单元格中?
【问题讨论】: