Как заставить R игнорировать значения N / A, не удаляя всю строку? - PullRequest
3 голосов
/ 16 апреля 2019

Я работаю с большим набором данных (около 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 (и я не могу удалить их или изменить их на 0sпоскольку они вызваны какой-то проблемой в процедуре отбора проб) в столбце 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 /, так как среднее значение - это просто N / Aзначение (или пустая ячейка, для меня это не имеет большого значения, так как они мне не нужны на графиках), и когда в месяце есть только пара N / As, для усреднения значения не N / As.Я мог бы делать строку за строкой одну и ту же процедуру агрегирования, а затем вручную помещать все в новый набор данных, но для столбца 40 это немного сложно ... Есть идеи?

1 Ответ

5 голосов
/ 16 апреля 2019

Мы можем использовать 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 в R.Сначала его следует преобразовать в NA, прежде чем пытаться это

При чтении данных с помощью read.table/read.csv, укажите элементы, которые будут NA с na.strings

dd <- read.csv('file.csv', na.strings = "N/A")

data

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))

Здесь мы указываем NA, потому что N/A является строкой, и это может изменить тип столбца character или factor в зависимости от способа его чтения (stringsAsFactors - опция)

...