gpt4 book ai didi

r - 在 data.table 的定义行数中操作

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

我正在处理一个数据表,其中包含数据组和每个位置(从 -1000 到 +1000)以及每个位置的计数。一个小例子看起来像这样:

dt.ex <- data.table(newID=rep(c("A","B"), each = 6), pos=rep(c(-2:3), 2), count= sample(c(1:100), 12))
newID pos count
1: A -2 29
2: A -1 32
3: A 0 33
4: A 1 45
5: A 2 51
6: A 3 26
7: B -2 22
8: B -1 79
9: B 0 2
10: B 1 48
11: B 2 87
12: B 3 38

我想要做的是计算每组 newID 的每 n 行之间的平均值(或总和)。即拆分为 n 行并聚合结果。这将是假设 n=3 并求和的输出:
newID pos count
A -2 94
A 1 122
B -2 103
B 1 173

老实说,我不知道如何在不使用某种循环的情况下开始 - 不建议使用 67094000 x 3 表。如果我只想计算每个 newID,例如 this会做的伎俩,但我还没有看到接近回答我的问题的解决方案。 Plyr 解决方案也是受欢迎的,尽管我觉得这可能太慢了。

最佳答案

另一种方法(不使用 .SD )是:

dt.ex[, seq := (seq_len(.N)-1) %/% 3, by=newID][, 
list(pos = mean(pos), count=sum(count)), list(newID, seq)]

对(相对)更大的数据进行基准测试:
set.seed(45)
get_grps <- function() paste(sample(letters, 5, TRUE), collapse="")
grps <- unique(replicate(1e4, get_grps()))

dt.in <- data.table(newID = sample(grps, 6e6, TRUE),
pos = sample(-1000:1000, 6e6, TRUE),
count = runif(6e6))
setkey(dt.in, newID)

require(microbenchmark)
eddi <- function(dt) {
dt[, .SD[, list(pos = mean(pos), count = sum(count)),
by = seq(0, .N-1) %/% 3], by = newID]
}

arun <- function(dt) {
dt[, seq := (seq_len(.N)-1) %/% 3, by=newID][,
list(pos = mean(pos), count=sum(count)), list(newID, seq)]
}

microbenchmark(o1 <- eddi(copy(dt.in)), o2 <- arun(copy(dt.in)), times=2)


Unit: seconds
expr min lq median uq max neval
o1 <- eddi(copy(dt.in)) 25.23282 25.23282 26.16009 27.08736 27.08736 2
o2 <- arun(copy(dt.in)) 13.59597 13.59597 14.41190 15.22783 15.22783 2

关于r - 在 data.table 的定义行数中操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18340712/

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