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