#r #aggregate
#r #агрегат
Вопрос:
Я работаю с большим набором данных (около 40 столбцов), и мне нужно агрегировать значения разных столбцов по месяцам, усредняя значения внутри месяца. Набор данных выглядит примерно так.
dd <-
mo yr Na NH4 NO2
1 2009 0.4 N/A N/A
1 2009 0.2 0.1 N/A
2 2009 0.5 0.6 0.4
2 2009 0.7 0.2 0.1
Я использовал
dd.agg=aggregate(.~mo yr, dd, FUN=mean)
чтобы создать новый набор данных, но поскольку у меня есть некоторые данные N / A (и я не могу их удалить или изменить на 0, потому что они вызваны некоторой проблемой в процедуре выборки) в столбце NO2, весь январь месяц удаляется из набора данных dd.agg. Я пытался добавить na.rm=TRUE, но, похоже, это не помогает.
По сути, мне нужно, чтобы R просто игнорировал наличие данных N / A. Не рассматривать их как 0 (это повлияет на среднее значение), а получить из этого набора данных что-то вроде этого
dd.agg <-
mo yr Na NH4 NO2
1 2009 0.3 0.1 N/A
2 2009 0.6 0.4 0.25
Где, если целый месяц состоит из N / As, среднее значение — это просто значение N / A (или пустая ячейка, для меня это не имеет большого значения, поскольку они мне не нужны на графиках), и когда в месяце всего пара N / As, для усреднения неN / Как значение.
Я мог бы выполнить одну и ту же процедуру агрегирования по строкам, а затем поместить все в новый набор данных вручную, но для столбца 40 это немного больно…
Есть идеи?
Ответ №1:
Мы можем использовать na.action = na.pass
aggregate(.~mo yr, dd, FUN=mean, na.rm = TRUE, na.action = na.pass)
# mo yr Na NH4 NO2
#1 1 2009 0.3 0.1 NaN
#2 2 2009 0.6 0.4 0.25
С tidyverse
помощью, это можно сделать с помощью
library(tidyverse)
dd %>%
group_by(mo, yr) %>%
summarise_all(mean, na.rm = TRUE)
ПРИМЕЧАНИЕ: N/A
не рассматривается как NA
in R
. Его следует сначала преобразовать в NA
, прежде чем пытаться это сделать
При чтении данных с read.table/read.csv
помощью укажите элементы, которые будут с NA
na.strings
dd <- read.csv('file.csv', na.strings = "N/A")
данные
dd <- structure(list(mo = c(1L, 1L, 2L, 2L), yr = c(2009L, 2009L, 2009L,
2009L), Na = c(0.4, 0.2, 0.5, 0.7), NH4 = c(NA, 0.1, 0.6, 0.2
), NO2 = c(NA, NA, 0.4, 0.1)), class = "data.frame", row.names = c(NA,
-4L))
Здесь мы указываем as NA
, поскольку N/A
это строка, и это может изменить тип столбца character
or factor
в зависимости от способа его чтения ( stringsAsFactors
— option)