gpt4 book ai didi

r - 我如何对 data.table 中特定列的不同子集取平均值?

转载 作者:行者123 更新时间:2023-12-04 10:31:58 25 4
gpt4 key购买 nike

给定一个样本数据框:
dt <- data.table(value=1:10,start=c(1,4,5,8,6,3,2,1,9,4),finish=c(3,7,8,9,10,10,4,10,10,8))
我想添加一个可以命名为 mean_column 的新列。此列的第 i 行应该具有值
mean( value[ seq( from = start[i], to=finish[i] ) ] )
我正在处理的真实数据有 2000 万行,所以我需要找到一种快速的方法来进行这个计算。

编辑:data.table 中的值列不需要是示例中的有序序列。此列中的每个值都可以采用任何正数。

最佳答案

这是一种使用来自 的非对等连接的方法.

dt <- data.table(value=c(10,1:9),start=c(1,4,5,8,6,3,2,1,9,4),finish=c(3,7,8,9,10,10,4,10,10,8))
dt[, id := .I]

dt[dt,
on = .(id >= start,
id <= finish),
.(i.id, i.value, mean_col = mean(x.value)),
by = .EACHI,
allow.cartesian = T]

id id i.id i.value mean_col
<int> <int> <int> <num> <num>
1: 1 3 1 10 4.333333
2: 4 7 2 1 4.500000
3: 5 8 3 2 5.500000
4: 8 9 4 3 7.500000
5: 6 10 5 4 7.000000
6: 3 10 6 5 5.500000
7: 2 4 7 6 2.000000
8: 1 10 8 7 5.500000
9: 9 10 9 8 8.500000
10: 4 8 10 9 5.000000

在我的计算机上尝试 2,000,000 行需要 4 秒,并提供与@jay.sf 相同的答案。
n = 2e6
dt <- data.table(value = sample(1000L, n, TRUE), start = sample(n, n, TRUE))
dt[, finish := start + sample(30, n, TRUE)]
dt[finish > n, finish := n]

system.time({
dt[, id := .I]
dt[dt,
on = .(id >= start,
id <= finish),
.(i.id, i.value, mean_col = mean(x.value)),
by = .EACHI,
allow.cartesian = T]
})

## user system elapsed
## 3.78 0.01 3.69

#jay.sf base approach
system.time({
FUNV3 <- Vectorize(function(x, y) x:y)
dt$mean.column2 <- with(dt, sapply(FUNV3(start, finish), function(x) mean(value[x])))
})

## user system elapsed
## 24.45 0.04 24.72

all.equal(dt$mean.column2, dt[dt,
on = .(id >= start,
id <= finish),
.(i.id, i.value, mean_col = mean(x.value)),
by = .EACHI,
allow.cartesian = T]$mean_col)

##[1] TRUE

关于r - 我如何对 data.table 中特定列的不同子集取平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59859102/

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