簡體   English   中英

所選列的行均值取決於其他列

[英]Row mean of selected columns conditional on a different column

假設在data.table中有許多模擬(和其他變量):

data <- setDT(data.frame(sim1=c(1,1,1), sim2= c(2,2,2), sim3=c(3,3,3), 
sim4=c(4,4,4), sim5=c(5,5,5), index=c(2,2,2)))

   sim1 sim2 sim3 sim4 sim5 index
1:    1    2    3    4    5  2
2:    1    2    3    4    5  2
3:    1    2    3    4    5  2

我要計算高於索引列的模擬平均值:

data[, higher.than.index.ave := rowMeans(.SD[.SD > index]),  
         .SDcols = names(data[, grepl(paste(paste("sim", 1:5, sep=""), 
                                collapse = "|") , names(data)), with=FALSE])]

我也嘗試過其他解決方案,但是沒有運氣。 有什么建議可以執行這樣的任務嗎?

data <- data.table(sim1=c(1,1,1), sim2= c(2,2,2), sim3=c(3,3,3), 
sim4=c(4,4,4), sim5=c(5,5,5), index=c(2,2,2))



data[, means := 
       rowMeans(data[, lapply(.SD, function(x) ifelse(x < index, NA, x))
                    ][, -'index'],
                  na.rm = T)]

或者,使用.SDcols僅選擇sim列:

data[, means := 
       rowMeans(data[, lapply(.SD, function(x) ifelse(x < index, NA, x))
                     , .SDcols = intersect(paste0('sim', 1:5), names(data))],
                na.rm = T)]

輸出:

data

   sim1 sim2 sim3 sim4 sim5 index means
1:    1    2    3    4    5     2   3.5
2:    1    2    3    4    5     2   3.5
3:    1    2    3    4    5     2   3.5
data$higher.than.index.ave <- apply(data,1,function(x) {y <- x[1:5]; mean(y[y>=x[6]])})

#    sim1 sim2 sim3 sim4 sim5 index higher.than.index.ave
# 1:    1    2    3    4    5     2                   3.5
# 2:    1    2    3    4    5     2                   3.5
# 3:    1    2    3    4    5     2                   3.5

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM