如何在不删除整个行的情况下让R忽略N / A值?

Raf*_*din 3 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
Run Code Online (Sandbox Code Playgroud)

我用过

dd.agg=aggregate(.~mo+yr, dd, FUN=mean)
Run Code Online (Sandbox Code Playgroud)

来创建一个新的数据集,但是由于我在NO2列中有一些N / A数据(并且由于采样过程中的某些问题,所以我无法将其删除或将其更改为0),所以整个一月已从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
Run Code Online (Sandbox Code Playgroud)

如果整个月由N / A组成,那么平均值就是N / A值(或一个空单元格,对我来说并不重要,因为我在图中不需要它们),以及当一个月有只需几个N / As,即可得出非N / As值的平均值。我可以逐行执行相同的聚合过程,然后将所有内容手动放入新的数据集中,但是对于40列来说有点痛苦...有什么想法吗?

akr*_*run 5

我们可以用 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
Run Code Online (Sandbox Code Playgroud)

使用tidyverse,可以使用

library(tidyverse)
dd %>% 
    group_by(mo, yr) %>% 
    summarise_all(mean, na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)

注意:N/A不能视为NA中的RNA在尝试此操作之前,应先将其转换为

当读取的数据read.table/read.csv,指定将是元素NAna.strings

dd <- read.csv('file.csv', na.strings = "N/A")
Run Code Online (Sandbox Code Playgroud)

数据

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))
Run Code Online (Sandbox Code Playgroud)

在这里,我们指定as为NA因为N/A是字符串,这可以更改characterfactor取决于其读取方式的列类型(stringsAsFactors-选项)