R 某些列和整个数据帧的和

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

我想分析气象数据,找出一个站点(Xn)每年超过某个树阈值的频率,以及整个数据帧的频率(因此我每年得到一个值)。 我尝试了一些使用Aggregate和Dplyr的方法,但它并没有真正起作用

首先,我给你我的数据帧(它只是一个虚拟DF,原始DF大约有80列和10000行):

这适用于每个站点,但如何在整个数据帧中获得每年超过的数据

我尝试了以下方法

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的总数,但我每年都需要它