Я хочу вычислить среднее значение строки для разных столбцов для каждой строки, как указано в другом столбце. В этом примере кадра данных столбец «number» находится в диапазоне от 1:11, а остальные 12 столбцов имеют имена от «block_1» до «block_12». Например, если «block» равен 5, я хочу вычислить среднее значение столбцов по строкам. с блока_6 по блок_12. Другими словами, среднее значение номера блока после указанного в столбце «число» до блока_12. Каждый идентификатор представляет собой уникальную запись, все строки должны быть сохранены. Как я могу этого добиться?

n <- 11 ; m <- 11 ; reps <- 12 
dff<-as.data.frame(cbind(matrix(sample.int(11, n, replace = TRUE), n, m/n), 
                    replicate(reps, sample(1:9, n, replace = TRUE)/10)))

myFun<- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}

dff$ID<-myFun(11)

dff<-data.table::setnames(dff, old = c('V1','V2','V3','V4', 'V5','V6','V7','V8','V9','V10', 'V11','V12','V13'), new = c('number','block_1','block_2','block_3','block_4', 'block_5','block_6','block_7','block_8','block_9','block_10', 'block_11','block_12'))
r
0
Tokaalmighty 10 Фев 2021 в 03:59

1 ответ

Лучший ответ

Вот один из вариантов базового R:

cols <- grep('block', names(dff), value = TRUE)
n <- length(cols)

dff$mean_value <- mapply(function(x, y) mean(unlist(dff[x, cols[y:n]])), 
                         seq(nrow(dff)), dff$number + 1)
0
Ronak Shah 10 Фев 2021 в 02:07