Я впечатлен количеством «как комбинировать строки / столбцы» потоков, но еще больше тем, что ни один из них не был особенно полезен или, по крайней мере, не применим к моей проблеме.
Мои данные выглядят так:
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".
Это работает, за исключением того факта, что ...
... он превращает все остальные существующие идентификаторы в числовые значения (и я не хочу, чтобы вторая строка кода - оператор ifelse - касалась любого из существующих идентификаторов, поэтому Я написал else==MyData$id
).
... это не особо причудливый код. Есть ли решение с одной строкой кода, которое делает трюк? Я видел другие подходы, использующие aggregate()
, но у меня это не сработало.