【发布时间】:2020-09-10 09:27:03
【问题描述】:
我目前正在处理一个包含 75 列和大约 9500 行的大型数据框。此数据框包含 1995 年至 2019 年期间每天对多个观察点的观察结果。
编辑:来自 dput(head(df)) 的打印
> dput(head(df))
structure(list(date = structure(c(9131, 9132, 9133, 9134, 9135,
9136), class = "Date"), x1 = c(50.75, 62.625, 57.25, 56.571,
36.75, 39.125), x2 = c(62.25, 58.714, 49.875, 56.375, 43.25,
41.625), x3 = c(90.25, NA, 70.125, 75.75, 83.286, 98.5),
x4 = c(60, 72, 68.375, 65.5, 63.25, 55.875), x5 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), xn = c(53.25,
61.143, 56.571, 58.571, 36.25, 44.375), year = c(1995, 1995, 1995, 1995,
1995, 1995), month = c(1, 1, 1, 1, 1, 1), day = c(1, 2, 3,
4, 5, 6)), row.names = c(NA, -6L), class = c("tbl_df", "tbl",
"data.frame"))
数据框看起来像下面的示例:
date x1 x2 x3 x4 x5 xn year month day
<date> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1995-01-01 50.8 62.2 90.2 60 NA 53.2 1995 1 1
2 1999-08-02 62.6 58.7 NA 72 NA 61.1 1999 8 2
3 2001-09-03 57.2 49.9 70.1 68.4 NA 56.6 2001 9 3
4 2008-05-04 56.6 56.4 75.8 65.5 NA 58.6 2008 5 4
5 2012-04-05 36.8 43.2 83.3 63.2 NA 36.2 2012 4 5
6 2019-12-31 39.1 41.6 98.5 55.9 NA 44.4 2019 12 31
str(df)
tibble [9,131 x 75] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ date : Date[1:9131], format: "1995-01-01" "1995-01-02" ...
$ x1 : num [1:9131] 50.8 62.6 57.2 56.6 36.8 ...
$ x2 : num [1:9131] 62.2 58.7 49.9 56.4 43.2 ...
xn
$ year : num [1:9131] 1995 1995 1995 1995 1995 ...
$ month : num [1:9131] 1 1 1 1 1 1 1 1 1 1 ...
$ day : num [1:9131] 1 2 3 4 5 6 7 8 9 10 ...
我的目标是获得每个观察点 xn 每年超过某个限制的所有观察的计数。 到目前为止,我尝试使用 Aggregate 函数来实现这一点。
为了获得每年的平均值,我使用了以下命令:
aggregate(list(df), by=list(year=df$year), mean, na.rm=TRUE)
这很完美,我得到了每个观察点每年的平均值。
为了得到一个站的总和,我使用了以下代码
aggregate(list(x1=df$x1), by=list(year=df$year), function(x) sum(rle(x)$values>120, na.rm=TRUE))
这导致了这个打印:
year x1
1 1995 52
2 1996 43
3 1997 44
4 1998 42
5 1999 38
6 2000 76
7 2001 52
8 2002 58
9 2003 110
10 2004 34
11 2005 64
12 2006 46
13 2007 46
14 2008 17
15 2009 41
16 2010 30
17 2011 40
18 2012 47
19 2013 40
20 2014 21
21 2015 56
22 2016 27
23 2017 45
24 2018 22
25 2019 45
到目前为止,一切都很好。我知道我可以通过将 (..,x2=data$x2, x3=data$x3,..xn) 添加到上面代码中的列表参数来扩展代码。我试过了,它们起作用了。
但是我怎样才能一次得到它们呢?
我尝试了以下代码:
aggregate(.~(date, year, month, day), by=list(year=df$year), function(x) sum(rle(x)$values>120, na.rm=TRUE))
Fehler: Unerwartete(s) ',' in "aggregate(.~(date,"
aggregate(.~date+year+month+day, by=list(year=df$year), function(x) sum(rle(x)$values>120, na.rm=TRUE))
Fehler in as.data.frame.default(data, optional = TRUE) :
cannot coerce class ‘"function"’ to a data.frame
aggregate(. ~ date + year + month + day, data = df,by=list(year=df$year), function(x) sum(rle(x)$values>120, na.rm=TRUE))
Fehler in aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...) :
Argumente müssen dieselbe Länge haben
但不幸的是,它们都不起作用。有人可以告诉我我的错误在哪里吗?
【问题讨论】:
-
欢迎来到 SO。您能否使您的问题可重现:以对象的形式包含一个最小数据集,例如,如果数据框为 df minimal reproducible example 和 How to Ask
-
你好安德烈。您是在问如何对输入数据框中的列求和,但仅针对一年中至少有 120 个观测值的那些年份,或者您是否要求对至少有 120 个非一年内没有观察,还是其他什么?
-
@Peter,感谢您的建议。我添加了 dput(head(df))。
-
@LenGreski Hej Len,不,我实际上想知道一年中有多少观测值大于 120。这适用于每个站 xn。