微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

x <- data.frame(c1=c("A","B","C","A","C"),c2=1:6,c3=c("sp1","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)]
,

使用 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
,

我们可以在 xtabs 中使用 base R

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。