r 沿向量搜索并计算平均值

标签 r vector mean

我有如下数据:

require(data.table)
DT <- data.table(x=c(19,19,19,21,21,19,19,22,22,22),
             y=c(53,54,55,32,44,45,49,56,57,58))

我想沿着 x 搜索,并计算 y 的平均值。
但是,在使用的时候。
DT[, .(my=mean(y)), by=.(x)]

我得到了 x 重合值的总体均值。
我想沿着 x 搜索,每次 x 变化时,我想计算一个新的平均值。对于提供的示例,输出将是:
DTans <- data.table(x=c(19,21,19,22),
             my=c(54,38,47,57))

最佳答案

我们可以使用 rleid要创建另一个分组变量,请获取 mean 'y',并将 'indx' 分配给 NULL

library(data.table) # v 1.9.5+
DT[, .(my = mean(y)), by = .(indx = rleid(x), x)][, indx := NULL]
#    x my
#1: 19 54
#2: 21 38
#3: 19 47
#4: 22 57

基准
set.seed(24)
foo <- function(x) sample(x, 1e7L, replace = TRUE)
DT  <- data.table(x = foo(100L), y = foo(10000L))

josilber <- function() {
    new.group <- c(1, diff(DT$x) != 0)
    res <- data.table(x = DT$x[new.group == 1], 
              my = tapply(DT$y, cumsum(new.group), mean))
}

Roland <- function() {
    DT[, .(my = mean(y), x = x[1]), by = cumsum(c(1, diff(x) != 0))]
}

akrun <- function() { 
    DT[, .(my = mean(y)), by = .(indx = rleid(x), x)][,indx := NULL]
}

bgoldst <- function() {
    with(rle(DT$x), data.frame(x = values, 
       my = tapply(DT$y, rep(1:length(lengths), lengths), mean)))
}

system.time(josilber())
#   user  system elapsed 
#159.405   1.759 161.110 

system.time(bgoldst())
#   user  system elapsed 
#162.628   0.782 163.380 

system.time(Roland())
#   user  system elapsed 
# 18.633   0.052  18.678 

system.time(akrun())
#   user  system elapsed 
# 1.242   0.003   1.246 

关于r 沿向量搜索并计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30685733/

相关文章:

c++ - vector <int> V[]和 vector <vector<int>> V的区别

c++ - std::vector 对于清除或删除 POD 的行为是否不同

R:从列表中计算mean()

r - 如何在 R 中复制 Excel 求解器

c# - 如何在 C# 中的 Winform 中嵌入 R 图?

r - dplyr::if_else 更改日期时间 (POSIXct) 值

r - 删除带有多个零的列

c++ - 删除使用 const_iterator 的 vector 的元素

java - 如何编写代码来查找数组中整数的众数,而不使用个人创建的方法,即常规的 "raw code"

python - 没有任何窗口大小的移动平均值或滚动平均值 Pandas