R 中是否有一个函数可以根据年份日期对值求和?



>我有一个数据表(Precip15(,由降水列,年份(DOY(和POSIXct格式的Date_Time组成。我需要能够看到记录的每一天的总降水量(Rain_cm(。有什么建议吗?

数据表格式的示例如下所示:

DOY     Rain     Rain_cm    Date_Time
179      6         0.6      2019-06-28 15:00:00
179      0         NA       2019-06-28 15:15:00
179      2         0.2      2019-06-28 16:45:00
180      0         NA       2019-06-29 10:00:00
180      10.2      1.2      2019-06-29 10:15:00
180      2         0.2      2019-06-29 13:00:00

我需要它看起来像这样:

DOY     Rain_cm    
179     0.8      
180     1.4

或者可能:

Date           Rain_cm
2019-06-28       0.8 
2019-06-29       1.4

提前感谢任何帮助!

下面是一些使用数据框的基本 R 解决方案,DF在末尾的注释中可重复地定义。 基于dplyr,data.table或zoo软件包的解决方案也是可能的。

1( 根据您想要的内容,在DOYDate(在下面的transform语句中定义(上聚合aggregate。 请注意,aggregate会自动删除带有 NA 的行。

aggregate(Rain_cm ~ DOY, DF, sum)
##   DOY Rain_cm
## 1 179     0.8
## 2 180     1.4
DF2 <- transform(DF, Date = as.Date(Date_Time))
aggregate(Rain_cm ~ Date, DF2, sum)
##         Date Rain_cm
## 1 2019-06-28     0.8
## 2 2019-06-29     1.4

2( 行和另一个基本 R 解决方案是rowsum返回一个单列矩阵,其中行名是分组变量的值。DF2来自 (1(。

with(na.omit(DF), rowsum(Rain_cm, DOY))
##     [,1]
## 179  0.8
## 180  1.4
with(na.omit(DF2), rowsum(Rain_cm, Date))
##            [,1]
## 2019-06-28  0.8
## 2019-06-29  1.4

3(应用另一种基本R方法是tapply。这将生成一个命名的数字向量。DF2来自 (1(。

with(DF, tapply(Rain_cm, DOY, sum, na.rm = TRUE))
## 179 180 
## 0.8 1.4 
with(DF2, tapply(Rain_cm, Date, sum, na.rm = TRUE))
## 2019-06-28 2019-06-29 
##        0.8        1.4

4( XTABxtabs可用于形成xtabstable对象。DF2来自 (1(。

xtabs(Rain_cm ~ DOY, DF)
## DOY
## 179 180 
## 0.8 1.4 
xtabs(Rain_cm ~ Date, DF2)
## Date
## 2019-06-28 2019-06-29 
##        0.8        1.4 

注意

假定可重现形式的数据为:

Lines <- "DOY     Rain     Rain_cm    Date_Time
179      6         0.6      2019-06-28 15:00:00
179      0         NA       2019-06-28 15:15:00
179      2         0.2      2019-06-28 16:45:00
180      0         NA       2019-06-29 10:00:00
180      10.2      1.2      2019-06-29 10:15:00
180      2         0.2      2019-06-29 13:00:00"
L <- readLines(textConnection(Lines))
DF <- read.csv(text = gsub("  +", ",", Lines))
df <- tribble(
~DOY,     ~Rain,     ~Rain_cm,    ~Date_Time
, 179      , 6         , 0.6      , "2019-06-28 15:00:00"
, 179      , 0         , NA       , "2019-06-28 15:15:00"
, 179      , 2         , 0.2      , "2019-06-28 16:45:00"
, 180      , 0         , NA       , "2019-06-29 10:00:00"
, 180      , 10.2      , 1.2      , "2019-06-29 10:15:00"
, 180      , 2         , 0.2      , "2019-06-29 13:00:00"
)
df %>%
mutate(Date_Time = ymd_hms(Date_Time)) %>%
mutate(Date = as.Date(Date_Time)) %>%
group_by(Date) %>%
summarise(perDate = sum(Rain_cm, na.rm = TRUE))
Date       perDate
<date>       <dbl>
1 2019-06-28     0.8
2 2019-06-29     1.4

您可以使用aggregatecut函数来计算每日总降水量值。以下代码将为您提供所需的结果:

precipTotals <- aggreate(df$Rain_cm ~ cut(df$Date_Time, breaks = "day"), x = df, 
FUN = sum, na.rm = TRUE)

确保您的沉淀列as.numeric()并且您的Date_Timeas.POSIXct()格式,这将对您有用。

最新更新