Объединить строки фрейма данных в R, используя colMeans? - PullRequest
0 голосов
/ 01 сентября 2018

Я впечатлен количеством «как комбинировать строки / столбцы» потоков, но еще больше тем, что ни один из них не был особенно полезен или, по крайней мере, не применим к моей проблеме.

Мои данные выглядят так:

MyData<-data.frame("id" = c("a","a","b"),
                   "value1_1990" = c(5,NA,1),
                   "value2_1990" = c(5,NA,2),
                   "value1_2000" = c(2,1,1),
                   "value2_2000" = c(2,1,2),
                   "value1_2010" = c(NA,9,1),
                   "value2_2010" = c(NA,9,2))

Что я хочу сделать, так это объединить две строки, где id=="a" для столбцов MyData[,(2:7)], используя базовые R colMeans.

Как это выглядит:

  id value1_1990 value2_1990 value1_2000 value2_2000 value1_2010 value2_2010
1  a           5           5           2           2          NA          NA
2  a          NA          NA           1           1           9           9
3  b           1           2           1           2           1           2

Что мне нужно:

  id value1_1990 value2_1990 value1_2000 value2_2000 value1_2010 value2_2010
1  a           5           5         1.5         1.5           9           9
2  b           1           2           1           2           1           2

Что я пробовал (среди множества других вещей):

MyData[nrow(MyData)+1, 2:7] = colMeans(MyData[which(MyData$id=="a"),(2:7)],na.rm=T) # to combine values from rows where id=="a"
MyData$id<-ifelse(is.na(MyData$id),"NewRow",MyData$id) # to replace "<NA>" in the id-column of the newly created row by "NewRow".

Это работает, за исключением того факта, что ...

  1. ... он превращает все остальные существующие идентификаторы в числовые значения (и я не хочу, чтобы вторая строка кода - оператор ifelse - касалась любого из существующих идентификаторов, поэтому Я написал else==MyData$id).

  2. ... это не особо причудливый код. Есть ли решение с одной строкой кода, которое делает трюк? Я видел другие подходы, использующие aggregate(), но у меня это не сработало.

1 Ответ

0 голосов
/ 01 сентября 2018

Вы можете попробовать использовать dplyr:

library(dplyr)

Возможное решение:

MyData %>% group_by(id) %>% summarise_all(funs(mean(., na.rm = TRUE)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...