3

我有一个非常简单的数据框:

    X Y
    ---
    A 1
    A 2
    B 3
    C 1
    C 3

我的最终结果应该是这样的列表:

$`A`
[1] 1 2

$`B`
[1] 3

$`C`
[1] 1 3

对于此操作,我使用 R 中的 split() 函数:

k <- split(Y, X)

这工作得很好。但是,如果我想将此代码应用于包含 2200 万行的数据帧,其中包括 1000 万组 X 和 387000 个 Y 值,它会变得非常耗时。我尝试使用 RRO 8.0 开放版本来支持 MKL。但是,仍然只使用一个内核。CPU 有 64 GB 的 RAM,所以这应该不是问题。

有什么更聪明的计算方法的想法吗?

4

2 回答 2

5

尝试

 library(data.table)
 DT <- as.data.table(df)
 DT1 <- DT[, list(Y=list(Y)), by=X]
 DT1$Y
 #[[1]]
 #[1] 1 2

 #[[2]]
 #[1] 3

 #[[3]]
 #[1] 1 3

或使用dplyr

 library(dplyr)
 df1 <-  df %>% 
             group_by(X) %>%
              do(Y=c(.$Y))

 df1$Y
 #[[1]]
 #[1] 1 2

 #[[2]]
 #[1] 3

 #[[3]]
 #[1] 1 3

数据

 df <- structure(list(X = c("A", "A", "B", "C", "C"), Y = c(1L, 2L, 
 3L, 1L, 3L)), .Names = c("X", "Y"), class = "data.frame", row.names = c(NA, 
 -5L))
于 2014-12-04T15:42:50.410 回答
2

我使用来自 dplyr 和/或 data.table 的类似代码找到了一个优雅的解决方案。我在 R 中寻找连接组,发现这篇文章:

在 R 中按组有效地连接一列中的字符内容

实际上,它与

dt = data.table(content = sample(letters, 26e6, T), groups = LETTERS)
df = as.data.frame(dt)

system.time(dt[, paste(content, collapse = " "), by = groups])
#   user  system elapsed 
#   5.37    0.06    5.65 

system.time(df %>% group_by(groups) %>% summarise(paste(content, collapse = " ")))
#   user  system elapsed 
#   7.10    0.13    7.67 

感谢你的帮助

于 2015-02-09T13:51:28.437 回答