我试图编写一个函数,它接受数据框和变量名称(或变量名称列表),并使用 group_by 和 summarize 函数输出摘要信息。 但是,我始终会收到以下错误:
Error: Problem with `mutate()` input `..1`.
x Input `..1` must be a vector, not a function.
i Input `..1` is `<fn>`.
或者出现以下错误:
Error in (function (x) : object 'ym' not found
最后一个错误显示找不到名为“value”的列,该列包含数据框被melting后的值。
以下是我的代码:
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)
这是一个小数据样本。请注意,“variable”是始终传入group_by函数的列,因此我决定将其硬编码。
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")
我该如何编写函数,以便在group_by函数中接受一个或多个列名?