【问题标题】:Handling NA's in aggregate function in R在r中处理na的聚合函数
【发布时间】:2018-08-07 23:34:25
【问题描述】:

我正在尝试使用聚合函数从 csv 文件中获取每日总和,但遇到以下错误:

Error in Summary.factor(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), na.rm = FALSE) : ‘sum’ not meaningful for factors
Calls: aggregate ... aggregate.data.frame -> lapply -> FUN -> lapply ->          Summary.factor 
Execution halted

这里是数据链接Data

这是我的代码:

dat<-read.csv("Laoag_tc_induced.csv",header=TRUE,sep=",")
dat[dat == -999] <- NA
dat[dat == -888] <- 0
dat$Date <- as.Date(strptime(dat$key, '%Y_%m_%d_%H'))

df <- data.frame(dat$Date,dat$RR,dat$dist)
df <- aggregate(RR ~ Date, dat,sum)

names(df)[1] <- "Date"
names(df)[2] <- "Rain"

write.table(df,file="test.csv",sep=",")

我尝试使用:

df <- aggregate(RR ~ Date, dat,sum,na.rm=TRUE)

df <- aggregate(RR ~ Date,dat,sum,na.rm=TRUE,na.action=na.pass)

错误还是一样:

‘sum’ not meaningful for factors

【问题讨论】:

    标签: r aggregate na


    【解决方案1】:

    “RR”中有某些元素,即" NA",将列的类更改为factor(也使用stringsAsFactors = FALSE)。选项将指定 na.strings 中的 NA 字符串读取为 NA

    dat <- read.csv(file, header = TRUE, stringsAsFactors = FALSE, 
              na.strings = "   NA", strip.white = TRUE)
    

    在做 OP 的转换/替换后,

    res <- aggregate(RR ~ Date, dat,sum)
    head(res, 5)
    #        Date  RR
    #1 1994-08-09 0.0
    #2 1994-08-10 0.0
    #3 1994-08-11 0.0
    #4 1994-08-12 0.3
    #5 1994-08-13 0.0
    

    正如 OP 所说的日期正在改变,它根据提供的数据工作正常

    dat[78:81,]
    #   X.1          key     SN CY     Lat.x    Lon.x     X   RR     Lat.y    Lon.y     dist       Date
    #78  78  1994_8_19_0 199419 19 0.3700098 2.230531 49133 28.8 0.3176499 2.104727 824.8680 1994-08-19
    #79  79  1994_8_19_6 199419 19 0.3787364 2.214823 49134 28.8 0.3176499 2.104727 765.4631 1994-08-19
    #80  80 1994_8_19_12 199419 19 0.3857178 2.200860 49135 28.8 0.3176499 2.104727 720.0335 1994-08-19
    #81  81 1994_8_19_18 199419 19 0.3926991 2.190388 49136 28.8 0.3176499 2.104727 700.1729 1994-08-19
    

    与csv数据中的相同

    【讨论】:

    • @Lyndz 我只使用了您共享的数据。因为 NA 是 " NA" 如果它只是数据的子集,则检查整个数据中除数字以外的任何其他字符串值,并在 na.strings 中指定。
    • @Lyndz 我没有收到您的警告信息。您还可以使用 dat &lt;- readr::read_csv(file) 包,它通过发现 NA 元素正确地进行了转换
    • @Lyndz 您需要检查'key'列格式head(dat$key, 3)# [1] "1994_8_9_0" "1994_8_9_6" "1994_8_9_12"。我不知道为什么你的年份后面跟着三个数字。当您使用as.Date 转换为Date 时,选择的格式为'%Y_%m_%d'。那么,最后一个数字是多少?
    • @Lyndz 您应该从具有您要更改的原始格式的“键”列转换。 dat$Date &lt;- as.Date(strptime(dat$key, format = '%Y_%m_%d_%H')) 而我这一步没有问题class(dat$Date)# [1] "Date"
    • @Lyndz 1994-08-19 有 8 行。您可以查看library(dplyr);datS &lt;- dat %&gt;% filter(Date == "1994-08-19"); datS %&gt;% pull(RR) %&gt;% sum [1] 230.4
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2015-11-19
    • 2016-06-27
    • 2017-04-10
    • 2022-07-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多