将列名传递给R dplyr group_by和SUMMARE函数

将列名传递给R dplyr group_by和SUMMARE函数,r,tidyr,mutate,R,Tidyr,Mutate,我正在尝试编写一个函数,它接受一个数据帧和一个变量名(或变量名列表),并使用group_by和SUMMARE函数输出摘要信息。但是,我不断收到以下错误之一: Error: Problem with `mutate()` input `..1`. x Input `..1` must be a vector, not a function. i Input `..1` is `<fn>`. 最后一个错误是,它找不到名为“value”的列,该列包含数据帧的值(熔化后) 这是我的密

我正在尝试编写一个函数,它接受一个数据帧和一个变量名(或变量名列表),并使用group_by和SUMMARE函数输出摘要信息。但是,我不断收到以下错误之一:

 Error: Problem with `mutate()` input `..1`.
 x Input `..1` must be a vector, not a function.
 i Input `..1` is `<fn>`.
最后一个错误是,它找不到名为“value”的列,该列包含数据帧的值(熔化后)

这是我的密码:

    tested <- melt(test_data, measure.vars = c('TA','PP','US','UD','UE','UG','UH','XR','RW','PA','TB4',
                                               'TV2','TV4','TV8','TV20','TV40','MV2','MV4','MV8','MV20','MV40','VB'), id.vars = c('TmStamp','year','month','ym','day','hour'))
    
    test_function <- function(data,col){
      stats <- data %>% group_by(!!col,variable) %>%
        summarize(N = length(value[!is.na(value)]),
                  Missing = length(value[is.na(value)]),
                  Per.Avail = (length(value[!is.na(value)])/(length(value[!is.na(value)]) + length(value[is.na(value)]))) * 100,
                  Mean = mean(value, na.rm=TRUE),
                  Median = median(value, na.rm=TRUE),
                  Min = min(value, na.rm=TRUE),
                  Max = max(value, na.rm=TRUE),
                  Range = max(value, na.rm=TRUE) - min(value, na.rm=TRUE),
                  Variance = var(value, na.rm=TRUE),
                  Std.Dev = sd(value, na.rm=TRUE),
                  Coef.Var = sd(value, na.rm=TRUE)/mean(value, na.rm=TRUE),
                  SE = sd(value, na.rm=TRUE)/sqrt(length(value[!is.na(value)])),
                  Skewness = e1071::skewness(value, na.rm=TRUE),
                  Kurtosis = e1071::kurtosis(value, na.rm=TRUE),
                  IQR = IQR(value, na.rm=TRUE),
                  MAD = mad(value, na.rm=TRUE)
        )
      return(stats)
    }

    test_function(tested, ym)

我如何编写此函数,使其按函数接受组中的一个或多个列名?

要使函数正常工作,请使用例如
{{col}
而不是
!!col
。要使函数适用于多个变量,可以使用
表示法,也可以使用该表示法通过以下方式将变量传递给group_:

库(dplyr)
测试功能%
汇总(N=长度(值[!is.na(值)]),
缺失=长度(值[is.na(值)]),
Per.Avail=(长度(值[!is.na(值)])/(长度(值[!is.na(值)])+长度(值[is.na(值)])*100,
平均值=平均值(数值,na.rm=真),
中位数=中位数(数值,na.rm=真),
最小值=最小值(值,na.rm=真),
Max=Max(值,na.rm=TRUE),
范围=最大(值,na.rm=真)-最小(值,na.rm=真),
方差=var(值,na.rm=真),
标准偏差=标准偏差(数值,na.rm=真),
系数Var=sd(值,na.rm=TRUE)/平均值(值,na.rm=TRUE),
SE=sd(值,na.rm=TRUE)/sqrt(长度(值[!is.na(值)]),
偏度=e1071::偏度(值,na.rm=TRUE),
峰度=e1071::峰度(值,na.rm=TRUE),
IQR=IQR(值,na.rm=TRUE),
MAD=MAD(值,na.rm=TRUE)
)
返回(统计)
}
测试功能(已测试,ym)
#>`summary()`按'variable'重新分组输出(用'.groups'参数重写)
#>#A tible:1 x 18
#>#组:变量[1]
#>变量ym N缺失每可用平均最小最大范围方差
#>                          
#>1 TA 10-2~20 0 100 5.30 5.33 4.25 6.01 1.76 0.283
#> # ... 还有7个变量:标准偏差、系数变量、SE、,
#>#偏度、峰度、IQR、MAD
测试功能(已测试,ym,年,月)
#>`summary()`按'variable','ym','year'重新组合输出(用'.groups'参数覆盖)
#>#A tible:1 x 20
#>#组:变量,ym,年份[1]
#>变量ym年-月N缺失每可用平均最小值最大值
#>                       
#>1 TA 10-2~2019 10 20 0 100 5.30 5.33 4.25 6.01
#> # ... 还有9个变量:范围、方差、标准偏差、,
#>#系数Var、SE、偏度、峰度、IQR、,
#>#疯了
    tested <- melt(test_data, measure.vars = c('TA','PP','US','UD','UE','UG','UH','XR','RW','PA','TB4',
                                               'TV2','TV4','TV8','TV20','TV40','MV2','MV4','MV8','MV20','MV40','VB'), id.vars = c('TmStamp','year','month','ym','day','hour'))
    
    test_function <- function(data,col){
      stats <- data %>% group_by(!!col,variable) %>%
        summarize(N = length(value[!is.na(value)]),
                  Missing = length(value[is.na(value)]),
                  Per.Avail = (length(value[!is.na(value)])/(length(value[!is.na(value)]) + length(value[is.na(value)]))) * 100,
                  Mean = mean(value, na.rm=TRUE),
                  Median = median(value, na.rm=TRUE),
                  Min = min(value, na.rm=TRUE),
                  Max = max(value, na.rm=TRUE),
                  Range = max(value, na.rm=TRUE) - min(value, na.rm=TRUE),
                  Variance = var(value, na.rm=TRUE),
                  Std.Dev = sd(value, na.rm=TRUE),
                  Coef.Var = sd(value, na.rm=TRUE)/mean(value, na.rm=TRUE),
                  SE = sd(value, na.rm=TRUE)/sqrt(length(value[!is.na(value)])),
                  Skewness = e1071::skewness(value, na.rm=TRUE),
                  Kurtosis = e1071::kurtosis(value, na.rm=TRUE),
                  IQR = IQR(value, na.rm=TRUE),
                  MAD = mad(value, na.rm=TRUE)
        )
      return(stats)
    }

    test_function(tested, ym)
structure(list(TmStamp = c("2019-10-01 12:00:00 AM", "2019-10-01 12:05:00 AM", 
"2019-10-01 12:10:00 AM", "2019-10-01 12:15:00 AM", "2019-10-01 12:20:00 AM", 
"2019-10-01 12:25:00 AM", "2019-10-01 12:30:00 AM", "2019-10-01 12:35:00 AM", 
"2019-10-01 12:40:00 AM", "2019-10-01 12:45:00 AM", "2019-10-01 12:50:00 AM", 
"2019-10-01 12:55:00 AM", "2019-10-01 01:00:00 AM", "2019-10-01 01:05:00 AM", 
"2019-10-01 01:10:00 AM", "2019-10-01 01:15:00 AM", "2019-10-01 01:20:00 AM", 
"2019-10-01 01:25:00 AM", "2019-10-01 01:30:00 AM", "2019-10-01 01:35:00 AM"
), year = c(2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 
2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019, 2019
), month = c(10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 
10, 10, 10, 10, 10, 10, 10, 10), ym = c("10-2019", "10-2019", 
"10-2019", "10-2019", "10-2019", "10-2019", "10-2019", "10-2019", 
"10-2019", "10-2019", "10-2019", "10-2019", "10-2019", "10-2019", 
"10-2019", "10-2019", "10-2019", "10-2019", "10-2019", "10-2019"
), day = structure(c(18170, 18170, 18170, 18170, 18170, 18170, 
18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 18170, 
18170, 18170, 18170, 18170, 18170), class = "Date"), hour = c(23L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L), variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("TA", 
"PP", "US", "UD", "UE", "UG", "UH", "XR", "RW", "PA", "TB4", 
"TV2", "TV4", "TV8", "TV20", "TV40", "MV2", "MV4", "MV8", "MV20", 
"MV40", "VB"), class = "factor"), value = c(6.008, 6.013, 5.915, 
5.777, 5.727, 5.679, 5.653, 5.591, 5.479, 5.353, 5.299, 5.249, 
5.256, 5.171, 5.01, 4.901, 4.716, 4.487, 4.397, 4.25)), row.names = c(NA, 
20L), class = "data.frame")