【问题标题】:Improving performance of split() function in R?提高 R 中 split() 函数的性能?
【发布时间】:2014-12-04 15:32:35
【问题描述】:

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

    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,所以这应该不是问题。

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

【问题讨论】:

  • 这些操作难道不能用data.table或dplyr来进行吗
  • 我尝试使用dplyr,但无法找到一种方法。在任何情况下dplyr 不会返回数据框吗?我认为列表结构更适合后期处理。
  • 您可以在data.table 和dplyr 中将列作为列表返回(使用do)
  • 我很乐意使用dplyr。在一次尝试中,我使用了 group_by 和 summarise 函数,但找不到最好的方法。
  • 你打算用这个列表做什么?也许你可以避免一起创建它

标签: r split statistics rro


【解决方案1】:

试试

 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))

【讨论】:

  • 我是 dplyr 的粉丝,但不幸的是,我注意到使用 dplyr::do 可能比其他 dplyr 慢得多。
  • @beginneR 感谢您的评论。我认为dplyr(目前)不适合列表操作。
  • 我会尝试使用data.table。我还没有使用这个包,因为我认为性能方面的 dplyr 和 data.table 是可以互换的。到目前为止,我更喜欢 dplyr 中的编码
  • @DanielSchultz 从一些基准测试来看,我认为对于大型数据集,data.table 更快。
  • 我现在正在尝试data.table 代码。 dplyrcode 将时间缩短到 3 小时。看看data.table能做什么。
【解决方案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 

感谢大家的帮助

【讨论】:

    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    相关资源
    最近更新 更多