加速 R 中的 tapply 函数,或另一个将数据帧转换为矩阵的函数

To speed up the tapply function in R, or another function to convert data frame into a matrix

我需要将一个巨大的数据集转换成一个矩阵。数据结构类似于下面的数据“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)

您可以使用 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)]

我们可以在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

另一个基本 R 选项使用 reshape

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