使用来自包 `modifiedmk` 的统计信息在 R 中创建汇总表

JAG*_*024 5 statistics pivot group-by r summary

我正在尝试从modifiedmkR 中的包运行一个函数。

install.packages('modifiedmk')
library(modifiedmk)
Run Code Online (Sandbox Code Playgroud)

我有一个数据框 data,我使用以下内容生成:

Station <- c('APT','APT', 'APT','APT', 'APT', 'APT', 'APT','APT', 'APT','APT','APT','APT',
              'AF','AF', 'AF','AF','AF','AF','AF','AF','AF',
             'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL', 'EL',
             'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS', 'GFS'
              )
Rainfall <- c(375.3, 263.3, 399.2, 242.6, 847.6, 276.5, 712.8, 366.3, 188.6, 478.4, 539, 682.5,
            520.7, 1337.8, 524, 908.4,748.5,411.8, 772.4,978.5,983,
            732.4, 788.6, 567.1, 576, 931.6, 727.2, 1079.3, 902.8,493.4,  630.7, 784.1,660.2, 531.3, 487.1,798.4,
            1064.1,  590.3, 1011.2, 1037.1,  1398.4, 1153.6,994.1,  1100.2,743.7,637.4, 792.2, 891.9,880.9, 670, 920.2,681.4)
Year <- c('1957','1958','1959','1960','1961','1962','1963','1964','1965','1966','1967','1968',
                  '1960','1961','1962','1963','1964','1965','1966','1967','1968',
                  '1957','1958','1959','1960','1961','1962','1963','1964','1965','1966','1967','1968','1969','1970','1971',
                  '1964','1965','1966','1967','1968','1969','1970','1971','1972','1973','1974','1975','1976','1977','1978','1979')
length(Year)
data<-data.frame(Year, Station, Rainfall)
Run Code Online (Sandbox Code Playgroud)

我有四个Stations降雨数据作为数据框中的行。我想应用该mmky1lag方法modifiedmk包中每个Station数据,并在 R 中生成一个包含两列的汇总表:

  1. 具有显着趋势的站点百分比,其中 p < 0.05
  2. 平均森斜率

例如,我可以mmky1lag在所有降雨数据上运行该方法,使用mmky1lag(as.vector(data$Rainfall))它产生

> mmky1lag(as.vector(data$Rainfall))
Corrected Zc  new P-value         N/N*   Original Z  old P.value 
3.332353e+00 8.611480e-04 1.297360e+00 3.795608e+00 1.472822e-04 
         Tau  Sen's slope old.variance new.variance 
3.634992e-01 9.092857e+00 1.605933e+04 2.083474e+04
Run Code Online (Sandbox Code Playgroud)

我对其中两个输出感兴趣:

第 1 列:

# Get percent of stations with significant trends where p < 0.05
mmky1lag(as.vector(data$Rainfall))[2] < 0.05
Run Code Online (Sandbox Code Playgroud)

和第 2 列:

# Make another column that is the mean Sen's slope
mmky1lag(as.vector(data$Rainfall))[7] 
Run Code Online (Sandbox Code Playgroud)

但是,如何将这种方法应用于data我为每个人获得结果的地方Station?在python中,我会分组Station然后应用该方法。但我不确定如何在 R 中做到这一点。

然后按站分组后,我想要一个包含上述两列信息的汇总表。

tes*_*ter 1

这接近吗?该百分比为零,因为所有 p 值都大于 5%。您需要< 0.05在循环中添加 来获取数据框中的真/假值。

results <- data.frame(matrix(NA, 4, 3))
colnames(results) <- c('station', 'p-val', 'Sen-slope')
for(ii in seq_along(unique(Station))){
  i <- unique(Station)[ii]
  results[ii, 1] <- i
  results[ii, 2] <- mmky1lag(as.vector(data$Rainfall[data$Station %in% i]))[2]
  results[ii, 3] <- mmky1lag(as.vector(data$Rainfall[data$Station %in% i]))[7]
}

> results
  station     p-val Sen-slope
1     APT 0.2005025  17.32083
2      AF 0.2140574  29.73750
3      EL 0.4561249  -9.60000
4     GFS 0.1854354 -19.65333
Run Code Online (Sandbox Code Playgroud)