【问题标题】:R: hourly to daily precipitation, Package plyr, ER:"no numeric values"R:每小时到每天的降水量,Package plyr,ER:“无数值”
【发布时间】:2014-05-11 20:51:09
【问题描述】:

我想在一个小时内总结出每小时的降水量值。

我的数据(Nd_hourly)如下所示:

    Datum   Uhrzeit Nd
1   2013-05-01  01:00:00    0.0
2   2013-05-01  02:00:00    0.1
3   2013-05-01  03:00:00    0.0
4   2013-05-01  04:00:00    0.3

(日期、时间、降水)

我想要输出 Datum - Nd

我用包 plyr 和函数 ddply 做了最低和最高温度

t_maxmin=ddply(t_air,.(Datum),summarize,Datum=Datum[which.max(T_Luft)],max.value=max(T_Luft),min.value=min(T_Luft))

然后我尝试对沉淀做类似的事情并尝试

Nd_daily=ddply(Nd_hourly,.(Datum),summarize,Datum=Datum, sum(Nd_hourly))

但得到错误信息

错误:仅在包含所有数值变量的数据框上定义

我认为我的数据输入可能有问题?我通过 .txt 文件从 Excel 2010 导入数据。

对于 R 和一般编程来说仍然很新,所以我非常感谢一些帮助 :)

【问题讨论】:

  • “总结一小时”和“基准输出 - Nd”是什么意思?对于每个日期和时间,您是否有多个观察结果?或者您的意思是总结每天每小时的Nd 观察结果?
  • 我们无法用您的玩具数据重现错误。请查看这些链接,了解有关如何创建可重现示例以及如何在 R 中执行此操作的一般想法:hereherehere

标签: r sum plyr


【解决方案1】:

我认为@Henrik 已经确定了您的问题,但这是另一种方法,使用data.table

# Create some fake datetime data
datetime <- seq(ISOdate(2000,1,1), ISOdate(2000,1,10), "hours")

# A data.frame with columns for date, time, and random precipitation data. 
DF <- data.frame(date=format(datetime, "%Y-%m-%d"),
                 time=format(datetime, "%H:%M:%S"),
                 precip=runif(length(datetime)))

head(DF)

#         date     time    precip
# 1 2000-01-01 12:00:00 0.9294353
# 2 2000-01-01 13:00:00 0.5082905
# 3 2000-01-01 14:00:00 0.5222088
# 4 2000-01-01 15:00:00 0.1841305
# 5 2000-01-01 16:00:00 0.9121000
# 6 2000-01-01 17:00:00 0.2434706

library(data.table)
DT <- as.data.table(DF) # convert to a data.table
DT[, list(precip=sum(precip)), by=date]

#           date    precip
#  1: 2000-01-01  7.563350
#  2: 2000-01-02 10.147659
#  3: 2000-01-03 10.936760
#  4: 2000-01-04 13.925727
#  5: 2000-01-05 11.415149
#  6: 2000-01-06 10.966494
#  7: 2000-01-07 12.751461
#  8: 2000-01-08 15.218148
#  9: 2000-01-09 12.213046
# 10: 2000-01-10  6.219439

data.tableshere 上有很棒的介绍性文字。

鉴于您的特定数据结构,以下应该可以解决问题。

library(data.table)
DT <- data.table(Nd_hourly)
DT[, list(Nd_daily=sum(Nd)), by=Datum]

【讨论】:

  • 感谢您的帮助 :) 我安装了该软件包,并且确实获得了每日价值。但是,这些值显然是错误的。在第一天,我应该有 0,6 的总降水量。我那天的结果是 30。知道出了什么问题吗?
  • 没有看到更多的数据很难说。 sapply(DT, class) 是否表示 Nd 是数字?它给你正好 30 吗?
  • @jbaums,另请参阅 OP:s 对我的回答的评论。听起来“Nd”是一个因素。 ddply 失败,而 data.table 似乎对因子的 as.numeric 版本求和。
  • 好的,我刚刚清理了环境,重新加载了输入,并做了和以前一样的事情,现在它工作得很好......似乎我的(失败的)家务和所有的试验和错误都搞砸了。 .. 刚刚检查,Nd 是数字,而其他两个是因子。但现在效果很好。非常感谢:)
  • @user3483945,当有人帮助了你时,你很感激你。另一种感谢那些花时间帮助你的人的另一种方法是对有用的答案进行投票。请阅读about Stackoverflowwhat to do when someone answersabout voting。干杯。
【解决方案2】:

这是你想要的吗?

library(plyr)
ddply(.data = df, .variables = .(Datum), summarize,
      sum_precip = sum(Nd))
#        Datum sum_precip
# 1 2013-05-01        0.4

【讨论】:

  • 感谢您的帮助。 “Datum = Datum”是我做最高和最低温度时的遗留物......你的评论帮助我理解了 ddply 函数的实际工作原理。我刚刚尝试过并收到以下错误消息:“总和对因素没有意义”。我想这意味着该功能有效但不能应用于我的数据?
  • 我猜,由于某种原因,当您读取数据时,R 将“Nd”解释为一个字符。 read.table 的默认行为是将字符转换为因子。您应该仔细检查该变量,以尝试检测 R 可能将什么解释为应该是数字的变量中的字符。从您提供的示例数据中无法判断(如您所见,这对我来说很好用)。
  • 您好,与上面的建议相同:一旦我清除环境并重新开始加载输入数据并运行脚本,您的方法就可以完美运行。似乎所有的试验和错误都把事情搞砸了。非常感谢您的所有帮助:)
猜你喜欢
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 2019-08-13
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多