我有这个data.frame:
Time a b c d
1 2015-01-01 00:00:00 863 1051 1899 25385
2 2015-01-01 01:00:00 920 1009 1658 24382
3 2015-01-01 02:00:00 1164 973 1371 22734
4 2015-01-01 03:00:00 1503 949 779 21286
5 2015-01-01 04:00:00 1826 953 720 20264
6 2015-01-01 05:00:00 2109 952 743 19905
...
Time a b c d
8756 2015-12-31 19:00:00 0 775 4957 28812
8757 2015-12-31 20:00:00 0 783 5615 29568
8758 2015-12-31 21:00:00 0 790 4838 28653
8759 2015-12-31 22:00:00 0 766 3841 27078
8760 2015-12-31 23:00:00 72 729 2179 24565
8761 2016-01-01 00:00:00 290 710 1612 23311
它代表一年中每天的每个小时。我想每天提取一行作为d最大值的函数。因此,最后我想获得365x5的data.frame。
我已经尝试了:Extract the maximum value within each group in a dataframe和Daily minimum values in R的所有命题,但仍然不起作用。
可能是由于我继续生成时间序列的方式造成的吗?
library(lubridate)
start <- dmy_hms("1 Jan 2015 00:00:00")
end <- dmy_hms("01 Jan 2016 00:00:00")
time <- as.data.frame(seq(start, end, by="hours"))
感谢帮助!
答案 0 :(得分:3)
如果我们按照“天”进行汇总,则将“时间”列转换为Date
类,剥离Time
属性(按这些属性分组),得到'd的max
'。在OP的帖子中,data.table
的语法涉及mydf
和df
。假设这些相同,我们需要
library(data.table)
setDT(mydf)[, .(d = max(d)), by = .(Day = as.Date(Time))]
或使用aggregate
中的base R
aggregate(d ~ Day, transform(mydf, Day = as.Date(Time)), FUN = max)
或与tidyverse
library(tidyverse)
mydf %>%
group_by(Day = as.Date(Time)) %>%
summarise(d = max(d))
注意:根据OP的注释,列'a'至'd'为factor
类。我们需要在开始时将其转换为numeric
或在处理阶段将其转换为
mydf$d <- as.numeric(as.character(mydf$d)))
对于多列
mydf[c('a', 'b', 'c', 'd')] <- lapply(mydf[c('a', 'b', 'c', 'd'), function(x)
as.numeric(as.character(x)))
mydf <- structure(list(Time = c("2015-01-01 00:00:00", "2015-01-01 01:00:00",
"2015-01-01 02:00:00", "2015-01-01 03:00:00", "2015-01-01 04:00:00",
"2015-01-01 05:00:00"), a = c(863L, 920L, 1164L, 1503L, 1826L,
2109L), b = c(1051L, 1009L, 973L, 949L, 953L, 952L), c = c(1899L,
1658L, 1371L, 779L, 720L, 743L), d = c(25385L, 24382L, 22734L,
21286L, 20264L, 19905L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
答案 1 :(得分:0)
'max'不适用于因子。因此,使用 as.numeric 将您要查找最大值的列(在您的情况下为 d 列)转换为两倍。 假设您的数据集在数据框中
mydf$d = as.numeric(mydf$d)
答案 2 :(得分:0)
感谢您的帮助!最后我选择
do.call(rbind, lapply(split(test,test$time), function(x) {return(x[which.max(x$d),])}))
这使我拥有365x5的data.frame。您的所有主张都是正确的。我只需要像
那样更改时间序列即可time <- as.data.frame(rep(c(1:365), each = 24))
test<- cbind.data.frame(time, df, timebis)
这使我拥有365x5的data.frame。您的所有主张都是正确的。我只需要更改时间序列即可。