2016-05-06 5 views
-2

Я новичок в R. Мне нужно рассчитать средство переменной для регулярного интервала для каждого человека. У меня есть этот простой фрейм данных.Вычислить средства столбцов в последовательности для каждой строки

df = data.frame(id=c("A","B","C","D"), 
      x1=c(3,5,7,2), x2= c(5,3,7,3), x3=c(5,6,4,4), x4=c(5,3,7,3), 
      x5=c(5,3,7,3), x6=c(5,4,7,1), x7= c(5,7,7,3), x8= c(5,3,8,3), 
      x9= c(4,3,2,3)) 

То, что я хочу, чтобы вычислить это средство каждого 4-го столбца (например, среднее для x1, x4, x7, переменные для каждого человека и х2, х5, х8 для каждого индивидуального и т.д.) в качестве нового кадра данных , Мой вывод должен быть следующим.

 y1  y2  y3 
A 4.333333 5.000000 4.666667 
B 5.000000 3.000000 4.333333 
C 7.000000 7.333333 4.333333 
D 2.666667 3.000000 2.666667 

В фактическом фрейме данных у меня есть 120 переменных и 40 человек.

Я искал предыдущие сообщения и старался сделать это следующим образом. Но, конечно, неправильный способ применения.

 df2<-with(df,(seq([,2], [,10], by=3)),FUN= function(x) mean(x, na.rm=TRUE)) 

Благодарим за любые советы.

+0

'colMeans (DF [- 1]) [сл (1, 10, от = 3)]'? – alistaire

+0

@ Zheyuan и @ alistaire Я редактировал вопрос. Надеюсь, это прояснит это. @ Zheyuan, да, вы правы. – sriya

ответ

1

Для кадра данных в приведенном примере вы можете использовать следующий код

new.df <- data.frame(id = c("A", "B", "C", "D")) 
for (i in 2:4) { 
    id <- seq(i, ncol(df), 3) 
    new.df[, i] <- rowMeans(df[,id]) 
} 

Просто Продлить его к фактическому кадру данных. Возможно, цикл for - это не лучшее решение, но первое, что появилось у меня в голове.

+1

Bro, Nice решение. Но для того, чтобы сделать его более общим, вы можете подумать о замене 'id <- seq (i, 10, 3)' на 'id <- seq (i, ncol (df), 3)' –

+1

приятный намек, я добавляю его. Спасибо! –

+0

Большое спасибо. Он прекрасно работает с моими фактическими данными. – sriya

1

Мы могли бы также использовать lapply с Reduce

n <- 3 
Reduce(`+`,lapply(seq(2, ncol(df), by =n), 
      function(i) df[i:(min(c(ncol(df), i+n-1)))]))/n 
#  x1  x2  x3 
#1 4.333333 5.000000 4.666667 
#2 5.000000 3.000000 4.333333 
#3 7.000000 7.333333 4.333333 
#4 2.666667 3.000000 2.666667 
Смежные вопросы