Агрегируйте данные по годам и переопределяйте NA в строке ТОЛЬКО при значении в столбце для этого года - PullRequest
0 голосов
/ 18 декабря 2018

Предположим, у меня есть фрейм данных:

 dfTest <- data.frame(year = c(1,2,3,1,3), 
               meanVal = c(1,2,3,1,3),
               var1 = c(1,2,3,1,3),
               var2 = c(NA,2,NA,1,3),
               var3 = c(1,NA,NA,1,3))


 > dfTest
    year meanVal var1 var2 var3
 1    1       1    1   NA    1
 2    2       2    2    2   NA
 3    3       3    3   NA   NA
 4    1       1    1    1    1
 5    3       3    3    3    3

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

> dfTest
   year meanVal var1 var2 var3
1    1       1    1    1    1
2    2       2    2    2   NA
3    3       3    3    3    3

Чтобы это произошло, строки нужно свернуть по годам.Если для столбца есть NA, его следует заменить значением в этом столбце.т.е. есть только 1 значение для var1 для года 1 (1).Однако некоторые строки в столбце var1 могут иметь NA.Кроме того, если для столбца существует только NA, как мы видим в 2-м году вар., NA должна остаться.

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Мы также можем сделать это с aggregate из base R.Создайте функцию для обработки случаев, когда для каждой группы есть одна строка (или несколько строк с all NA), и это пропущенное значение.Метод по умолчанию для mean возвращает NaN при применении с na.rm = TRUE

aggregate(.~ year, dfTest, mean, na.rm = TRUE, na.action = NULL)

Чтобы избежать получения NaN, создайте функцию (f1), которая проверяет, являются ли элементы all элементамиNA для определенного столбца в группе.С if/else мы можем вернуть NA для этих случаев.

f1 <- function(x) if(all(is.na(x))) NA else mean(x, na.rm = TRUE)
aggregate(.~ year, dfTest, f1, na.action = NULL)
#  year meanVal var1 var2 var3
#1    1       1    1    1    1
#2    2       2    2    2   NA
#3    3       3    3    3    3
0 голосов
/ 18 декабря 2018

В базе R это можно сделать с помощью split/lapply.

res <- lapply(split(dfTest, dfTest$year), function(DF){
  c(year = unique(DF[["year"]]),
    meanVal = unique(DF[["meanVal"]]),
    colMeans(DF[3:5], na.rm = TRUE)
    )
})
res <- do.call(rbind, res)
is.na(res) <- is.nan(res)

res
#  year meanVal var1 var2 var3
#1    1       1    1    1    1
#2    2       2    2    2   NA
#3    3       3    3    3    3
...