R 某些列和整个数据帧的和
我想分析气象数据,找出一个站点(Xn)每年超过某个树阈值的频率,以及整个数据帧的频率(因此我每年得到一个值)。 我尝试了一些使用Aggregate和Dplyr的方法,但它并没有真正起作用 首先,我给你我的数据帧(它只是一个虚拟DF,原始DF大约有80列和10000行): 这适用于每个站点,但如何在整个数据帧中获得每年超过的数据 我尝试了以下方法R 某些列和整个数据帧的和,r,dplyr,aggregate,R,Dplyr,Aggregate,我想分析气象数据,找出一个站点(Xn)每年超过某个树阈值的频率,以及整个数据帧的频率(因此我每年得到一个值)。 我尝试了一些使用Aggregate和Dplyr的方法,但它并没有真正起作用 首先,我给你我的数据帧(它只是一个虚拟DF,原始DF大约有80列和10000行): 这适用于每个站点,但如何在整个数据帧中获得每年超过的数据 我尝试了以下方法 aggregate.data.frame(x=test_sto[2:7] > 120, by = list(test_sto$year), FUN
aggregate.data.frame(x=test_sto[2:7] > 120, by = list(test_sto$year), FUN = colSums(test_sto[2:7] > 120, na.rm = TRUE), na.rm=TRUE )
但这显然不起作用,但我不知道如何将类似于colSums的东西放入这个函数中
我的第二种方法是使用dplyr,但在这里,我对我认为的语法感到困惑:
test_sto %>% group_by(year) %>%
summarise_all(funs((colSums(test_sto[2:7] > 120, na.rm=TRUE))))
year date_df1 X1 X2 X3 X4 X5 X6 month day
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1995 601 601 601 601 601 601 601 601 601
2 1995 576 576 576 576 576 576 576 576 576
3 1995 610 610 610 610 610 610 610 610 610
4 1995 622 622 622 622 622 622 622 622 622
5 1995 610 610 610 610 610 610 610 610 610
6 1995 616 616 616 616 616 616 616 616 616
7 1996 601 601 601 601 601 601 601 601 601
8 1996 576 576 576 576 576 576 576 576 576
9 1996 610 610 610 610 610 610 610 610 610
10 1996 622 622 622 622 622 622 622 622 622
test\u sto%>%按年份分组%>%
总结所有(funs((colSums(test_sto[2:7]>120,na.rm=TRUE)))
年份日期_df1x1 X2 X3 X4 X5 X6月日
1 1995 601 601 601 601 601 601 601 601 601
2 1995 576 576 576 576 576 576 576 576 576
3 1995 610 610 610 610 610 610 610 610 610
4 1995 622 622 622 622 622 622 622 622 622
5 1995 610 610 610 610 610 610 610 610 610
6 1995 616 616 616 616 616 616 616 616 616
7 1996 601 601 601 601 601 601 601 601 601
8 1996 576 576 576 576 576 576 576 576 576
9 1996 610 610 610 610 610 610 610 610 610
10 1996 622 622 622 622 622 622 622 622 622
每一列都有相同的值,这肯定是不正确的,但我找不到我的错误。而且年份也不正确。
这里的目标与上面相同,一个站点超过treshold的频率是多少,整个数据帧也是如此。不确定,但我相信这就是您要寻找的
library(data.table)
# make it a data.table
setDT(test_sto)
# part 1: >120 by year
test_sto[, lapply(.SD, function(x) sum(x > 120)),
by = .(year),
.SDcols = patterns("^X")]
# year X1 X2 X3 X4 X5 X6
# 1: 1995 143 141 159 152 147 144
# 2: 1996 153 141 148 153 160 165
# 3: 1997 148 126 150 149 139 153
# 4: 1998 144 150 138 152 145 138
# 5: 1999 13 18 15 16 19 16
# part 2: totals >120 by station over all years
test_sto[, lapply(.SD, function(x) sum(x > 120)),
.SDcols = patterns("^X")]
# X1 X2 X3 X4 X5 X6
# 1: 601 576 610 622 610 616
不确定,但我相信这就是你要找的
library(data.table)
# make it a data.table
setDT(test_sto)
# part 1: >120 by year
test_sto[, lapply(.SD, function(x) sum(x > 120)),
by = .(year),
.SDcols = patterns("^X")]
# year X1 X2 X3 X4 X5 X6
# 1: 1995 143 141 159 152 147 144
# 2: 1996 153 141 148 153 160 165
# 3: 1997 148 126 150 149 139 153
# 4: 1998 144 150 138 152 145 138
# 5: 1999 13 18 15 16 19 16
# part 2: totals >120 by station over all years
test_sto[, lapply(.SD, function(x) sum(x > 120)),
.SDcols = patterns("^X")]
# X1 X2 X3 X4 X5 X6
# 1: 601 576 610 622 610 616
使用
tidyverse
可以执行以下操作:
library(tidyverse)
test_sto %>%
group_by(year) %>%
summarise(across(starts_with("X"), ~sum(. > 120)))
输出
year X1 X2 X3 X4 X5 X6
<dbl> <int> <int> <int> <int> <int> <int>
1 1995 143 141 159 152 147 144
2 1996 153 141 148 153 160 165
3 1997 148 126 150 149 139 153
4 1998 144 150 138 152 145 138
5 1999 13 18 15 16 19 16
year gtr_120
<dbl> <int>
1 1995 886
2 1996 920
3 1997 865
4 1998 867
5 1999 97
输出
year X1 X2 X3 X4 X5 X6
<dbl> <int> <int> <int> <int> <int> <int>
1 1995 143 141 159 152 147 144
2 1996 153 141 148 153 160 165
3 1997 148 126 150 149 139 153
4 1998 144 150 138 152 145 138
5 1999 13 18 15 16 19 16
year gtr_120
<dbl> <int>
1 1995 886
2 1996 920
3 1997 865
4 1998 867
5 1999 97
全球技术法规第120年
1 1995 886
2 1996 920
3 1997 865
4 1998 867
5 1999 97
使用tidyverse
可以执行以下操作:
library(tidyverse)
test_sto %>%
group_by(year) %>%
summarise(across(starts_with("X"), ~sum(. > 120)))
输出
year X1 X2 X3 X4 X5 X6
<dbl> <int> <int> <int> <int> <int> <int>
1 1995 143 141 159 152 147 144
2 1996 153 141 148 153 160 165
3 1997 148 126 150 149 139 153
4 1998 144 150 138 152 145 138
5 1999 13 18 15 16 19 16
year gtr_120
<dbl> <int>
1 1995 886
2 1996 920
3 1997 865
4 1998 867
5 1999 97
输出
year X1 X2 X3 X4 X5 X6
<dbl> <int> <int> <int> <int> <int> <int>
1 1995 143 141 159 152 147 144
2 1996 153 141 148 153 160 165
3 1997 148 126 150 149 139 153
4 1998 144 150 138 152 145 138
5 1999 13 18 15 16 19 16
year gtr_120
<dbl> <int>
1 1995 886
2 1996 920
3 1997 865
4 1998 867
5 1999 97
全球技术法规第120年
1 1995 886
2 1996 920
3 1997 865
4 1998 867
5 1999 97
提示:如果没有set.seed()
,您的输出将无法再现。我必须将set.seed()放在哪里?例如:DF1在另一行中,在df1上方添加行set.seed(123)
,并更新[相应地更新您所需的输出。提示:如果没有set.seed()
,您的输出将无法再现我必须在何处放置set.seed()?例如:DF1在另一行中,在df1上方添加行set.seed(123)
,并更新[请相应地注明所需的输出日期。谢谢!是的,第一部分看起来不错。但是对于第二部分,我要查找整个数据帧的treshold超过每年一个值。sum(colSums(test_sto[2:7]>120,na.rm=TRUE))->有了这个,我得到了每个站点加起来的treshold Overses的数量,但我每年都需要它谢谢!是的,第一部分看起来不错。但是对于第二部分,我在寻找整个数据帧的treshold Overses,比如每年一个值。sum(colSums(test_sto[2:7]>120,na.rm=TRUE))->有了这个,我得到了每个电台的treshold的总数,但我每年都需要它