gpt4 book ai didi

R计算每行出现的次数非常慢

转载 作者:行者123 更新时间:2023-12-02 01:01:18 25 4
gpt4 key购买 nike

我正在尝试获取数据框中每行出现的所有值,如下所示:

     a   b  c  d  e
1 1 1 0 -1 NA
2 0 -1 -1 1 NA
3 -1 0 NA NA 1

对此

     a   b  c  d  e count.-1 count.0 count.1 count.NA
1 1 1 0 -1 NA 1 1 2 1
2 0 -1 -1 1 NA 2 1 1 1
3 1 0 NA NA 1 0 1 2 2

我现在这样做:

    df = df %>%
by_row(
..f = function(x) {
sum(is.na(x[1:8]))
},
.to = "count_na",
.collate = "cols"
) %>%
by_row(
..f = function(x) {
sum(x[1:8] == 1, na.rm = T)
},
.to = "count_positive",
.collate = "cols"
) %>%
by_row(
..f = function(x) {
sum(x[1:8] == -1, na.rm = T)
},
.to = "count_negative",
.collate = "cols"
) %>%
by_row(
..f = function(x) {
sum(x[1:8] == 0, na.rm = T)
},
.to = "count_neutral",
.collate = "cols"
)

但问题是,对于 500 万行,这需要很长时间才能完成(超过 3 小时,是否有更好的方法来完成此操作?

最佳答案

您可以使用data.table 进行快速处理。首先,融入长格式,然后按行号和值制表,然后返回并加入以获得所需的输出

agg <- dcast(melt(DT[, rn:=.I], id.vars="rn")[, .N, by=.(rn, value)], 
rn ~ value, sum, value.var="N")
DT[agg, on=.(rn)]

示例数据:

library(data.table)
set.seed(0L)
DT <- as.data.table(matrix(sample(c(-1L, 0L, 1L, NA_integer_), 5*5e6, replace=TRUE), ncol=5))
DT

编辑:添加了一些时间。 tl;dr 大约 10 秒,使用 data.table

处理 500 万行数据集
dtmtd <- function() {
agg <- dcast(melt(DT[, rn:=.I], id.vars="rn")[, .N, by=.(rn, value)],
rn ~ value, sum, value.var="N")
DT[agg, on=.(rn)]

}
microbenchmark::microbenchmark(dtmtd(), times=3L)

时间:

Unit: seconds
expr min lq mean median uq max neval
dtmtd() 10.07663 10.14351 10.17387 10.2104 10.22249 10.23458 3

关于R计算每行出现的次数非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50446077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com