我正在处理一个大数据集(大约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)
创建一个新的数据集,但是由于我在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
如果整个月都由N /组成,那么平均值就是N / A值(或一个空单元格,对我来说这并不重要,因为我在图中不需要它们)一个月只有几个N / As,以平均非N / As值。 我可以逐行执行相同的聚合过程,然后将所有内容手动放入新的数据集中,但是对于40列来说有点麻烦... 有什么想法吗?
答案 0 :(得分: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
使用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")
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
的列类型({ {1}}-选项)