Среднее значение ряда выбранных столбцов, условных для другого столбца - PullRequest
0 голосов
/ 01 июня 2018

Предположим, есть много симуляций (и других переменных) в 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])]

Я пробовал и другие решения, но не повезло.Любое предложение, как я могу выполнить такую ​​задачу?

Ответы [ 2 ]

0 голосов
/ 01 июня 2018
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
0 голосов
/ 01 июня 2018
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...