我有一个非常简单的数据框:
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,因此不应该是一个问题。
有什么想法可以更明智地计算出来吗?
答案 0 :(得分: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))
答案 1 :(得分:2)
我使用dplyr和/或data.table中的类似代码找到了一个优雅的解决方案。我在R中查找了连接组,我发现了这篇文章:
Efficiently concate character content within one column, by group in 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
感谢您的帮助