【问题标题】:Create dataframe from aggregate with function使用函数从聚合创建数据框
【发布时间】:2014-04-11 02:53:47
【问题描述】:

这是我在Can I subset specific years and months directly from POSIXct datetimes?提出的问题的后续行动

我有一个数据框

test <- data.frame(seq(from = as.POSIXct("1983-03-09 01:00"), to = as.POSIXct("1985-01-08 00:00"), by = "hour"))
colnames(test) <- "DateTime"
test$Value<-sample(0:100,16104,rep=TRUE)

我正在使用特定年份和月份进行子集化

# Add year column
test$Year <- as.numeric(format(test$DateTime, "%Y"))

# Add month column
test$Month <- as.numeric(format(test$DateTime, "%m"))

# Subset specific year (1984 in this case)
sub1 = subset(test, Year!="1983" & Year!="1985")

# Subset specific months (April and May in this case)
sub2 = subset(test, Month=="4" | Month=="5")

从sub1 和sub2 的这些子集中,我想使用每小时数据来计算Value 列中的每日最小值、平均值和最大值。

我在Aggregating hourly data into daily aggregates找到了解决方案

stat <- function(x) c(min = min(x), max = max(x), mean = mean(x))
sub1$Date <- as.Date(sub1$DateTime)
sub2$Date <- as.Date(sub2$DateTime)
aggregate(Value ~ Date, sub1, stat)
aggregate(Value ~ Date, sub2, stat)

这似乎给出了列中的最小值、平均值和最大值(尽管我无法验证,因为我无法读取 R 输出窗口的顶部)。我需要将这些aggregate 结果转换为包含Date、min、mean 和max 的数据框。有谁知道我该怎么做?我试过了

sub1.sum <- aggregate(Value ~ Date, sub1, stat)

和

sub1.sum <- as.data.frame(aggregate(Value ~ Date, sub1, stat))

但这似乎只返回一个值(我不确定这是最小值、平均值还是最大值)。

【问题讨论】:

  • 好的,当我运行你的代码时aggregate(Value ~ Date, sub1, stat) 返回Date Value.min Value.max Value.mean 1 1984-01-01 1.00000 76.00000 41.93750 . .......... ....... ........ ........ 这不是你想要的。
  • 你好 CCurtis,是的,这就是我想要的,但我想将这些结果存储在一个数据框中,其中包含日期、最小值、平均值和最大值列。你知道我该怎么做吗?到目前为止(上图)我的尝试都失败了。

标签: r


【解决方案1】:

cbind(sub1.sum[,-2, drop=FALSE], as.data.frame(sub1.sum$Value)) 给你你想要的,我猜。之前的问题是 value 列由 3 个维度(min、mean、max)组成......

【讨论】:

  • 不错。好的,试图了解您的回答是如何工作的。使用 -2 进行索引有什么作用?我从来没有遇到过这样的问题,R 会向您显示数据但不允许您将其放入表格中。
  • -2 表示除第二列之外的所有列。你也可以说sub1.sum[,1, drop=FALSE] 只保留第一列(日期)。 drop=FALSE 防止将单列数据帧转换为向量。所以代码总共做的是:将 Dates 列与 Value 中的三列粘贴在一起(cbind 用于列绑定)。
  • 好的,调用sub1.sum$Value 只是返回我假设的最小值最大值。以前主要没有看到用于索引的负值。知道是一个很好的技巧。同样有趣的是,aggregate 将三个值添加到单个列中,但只返回 1 并且没有报告任何错误。
猜你喜欢
  • 2020-12-17
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 2020-10-01
  • 1970-01-01
相关资源
最近更新 更多