如何解决加速 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 举报,一经查实,本站将立刻删除。