【问题标题】:To speed up the tapply function in R, or another function to convert data frame into a matrix加速 R 中的 tapply 函数,或其他将数据帧转换为矩阵的函数
【发布时间】:2021-08-20 06:12:41
【问题描述】:

我需要将一个巨大的数据集转换为一个矩阵。数据结构喜欢下面的数据“x”。当我使用函数 tapply 执行此操作时(见下文),由于庞大数据集的内存限制,它无法工作。 我想知道是否还有其他方法可以做到这一点。我尝试了 R 包 dplyr,但不知道该怎么做。有什么建议吗?非常感谢。

x <- data.frame(c1=c("A","B","C","A","B","C"), c2=1:6, c3=c("sp1","sp2","sp2","sp2","sp3","sp4"))
y <- tapply(x$c2, list(x$c1, x$c3), sum)

【问题讨论】:

    标签: r matrix dplyr tapply


    【解决方案1】:

    另一个使用reshape的基本R选项

    reshape(
      x,
      direction = "wide",
      idvar = "c1",
      timevar = "c3"
    )
    

    给予

      c1 c2.sp1 c2.sp2 c2.sp3 c2.sp4
    1  A      1      4     NA     NA
    2  B     NA      2      5     NA
    3  C     NA      3     NA      6
    

    【讨论】:

      【解决方案2】:

      我们可以在base R中使用xtabs

      xtabs(c2 ~ c1 + c3, x)
      #   c3
      #c1  sp1 sp2 sp3 sp4
      #  A   1   4   0   0
      #  B   0   2   5   0
      #  C   0   3   0   6
      

      【讨论】:

        【解决方案3】:

        你可以使用pivot_wider

        tidyr::pivot_wider(x, names_from = c3, values_from = c2, 
                           values_fn = sum, values_fill = 0)
        
        #  c1      sp1   sp2   sp3   sp4
        #  <chr> <int> <int> <int> <int>
        #1 A         1     4     0     0
        #2 B         0     2     5     0
        #3 C         0     3     0     6
        

        data.table 通常更快,在这种情况下您可以使用 -

        library(data.table)
        dcast(setDT(x), c1~c3, value.var = 'c2', fun.aggregate = sum)
        

        输出也可以用长格式表示。

        library(dplyr)
        
        x %>% 
          group_by(c1, c3) %>%
          summarise(c2 = sum(c2)) %>%
          ungroup
        

        data.table -

        setDT(x)[, sum(c2), .(c1, c3)]
        

        【讨论】:

          猜你喜欢
          • 2020-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-27
          相关资源
          最近更新 更多