2013-01-18 2 views
2

Я только что очистил кадр данных, который я вырвал из таблицы Excel, среди прочего, удаляя процентные знаки из некоторых цифр, см., Removing Percentages from a Data Frame.Среднее значение в трех экземплярах

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

DF1 <- data.frame(X = 1:24, Y = 2 * (1:24), Z = 3 * (1:24)) 

Я хочу найти средний каждый из трех повторов (которые, к счастью, находятся в последовательном порядке) и создать новый фрейм данных с восьмью строками и таким же количество столбцов ,

Я пытался сделать это с помощью,

DF2 <- data.frame(replicate(3,sapply(DF1, mean))) 

, который дал мне средний каждый столбец в виде строки в три раза. Я хотел получить информационную рамку, которая даст мне,

data.frame(X = c(2,5,8,11,14,17,20,23), Y = c(4,10,16,22,28,34,40,23), Z = c(6,15,24,33,42,51,60,69)) 

, который я разработал вручную; это должен быть уменьшенный результат.

Благодаря ...

Любая помощь будет с благодарностью получил.

+0

вы смотрели на это? http://stackoverflow.com/questions/10945703/r-calculate-row-means-on-specific-columns –

+2

спасибо за ссылку @Rachel, это близко, но не совсем то, что мне нужно. – user1945827

ответ

1

Это работает:

foo <- matrix(unlist(by(data=DF1,INDICES=rep(1:8,each=3),FUN=colMeans)), 
    nrow=8,byrow=TRUE) 
colnames(foo) <- colnames(DF1) 

Посмотрите на ?by.

+0

Привет @Stephan, ваш код почти работает. Я потерял заголовки в столбцах. Я попробовал сценарий снова, используя 'data.frame' вместо 'matrix', но это вернуло беспорядок. Я буду придерживаться вашего сценария и использовать «имена», чтобы вернуть заголовки, если ничего больше не появится. Спасибо, – user1945827

+0

Я отредактировал код, чтобы добавить 'colnames'. Но решение @Tomas намного лучше, так что +1 к нему. –

+0

Ваши модификации работают @Stephan. Благодарю. – user1945827

4

Хорошая задача для codegolf!

aggregate(DF1, list(rep(1:8, each=3)), mean)[,-1] 

быть более общим, вы должны заменить 8 с nrow(DF1).

... или мое любимое, с помощью умножения матриц:

t(t(DF1) %*% diag(8)[rep(1:8,each=3),]/3) 
+0

Спасибо за ваши ответы. Первый возвращает кадр data.frame, а второй возвращает матрицу? Я спрашиваю, потому что способ, которым R возвращает результаты, выглядит несколько иначе. – user1945827

+0

@ пользователь1945827, точно. Их можно вывести с помощью 'as.matrix' или' as.data.frame'. – TMS

+0

в первом ответе, когда я меняю «8» на nrow (DF1), я получаю сообщение об ошибке. Не знаю, почему, подумал, что вы, возможно, хотели бы знать. – user1945827

Смежные вопросы