我试图编写一个函数,该函数采用数据帧和变量名(或变量名列表),并使用group_by和summary函数输出摘要信息。然而,我不断得到以下错误之一:
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”的列,该列包含数据框的值(熔化后)。
这是我的代码:
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)
这是一个小数据示例。请注意,“变量”是一个总是被传递到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函数中的一个或多个列名?
要使函数正常工作,请使用例如<code>{{col}}</code>而不是<code}!!col。要使函数适用于多个变量,可以使用<code>.</code>符号,也可以使用它将变量传递给group_by:
library(dplyr)
test_function <- function(data, ...){
stats <- data %>%
group_by(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)
#> `summarise()` regrouping output by 'variable' (override with `.groups` argument)
#> # A tibble: 1 x 18
#> # Groups: variable [1]
#> variable ym N Missing Per.Avail Mean Median Min Max Range Variance
#> <fct> <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 TA 10-2~ 20 0 100 5.30 5.33 4.25 6.01 1.76 0.283
#> # ... with 7 more variables: Std.Dev <dbl>, Coef.Var <dbl>, SE <dbl>,
#> # Skewness <dbl>, Kurtosis <dbl>, IQR <dbl>, MAD <dbl>
test_function(tested, ym, year, month)
#> `summarise()` regrouping output by 'variable', 'ym', 'year' (override with `.groups` argument)
#> # A tibble: 1 x 20
#> # Groups: variable, ym, year [1]
#> variable ym year month N Missing Per.Avail Mean Median Min Max
#> <fct> <chr> <dbl> <dbl> <int> <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 TA 10-2~ 2019 10 20 0 100 5.30 5.33 4.25 6.01
#> # ... with 9 more variables: Range <dbl>, Variance <dbl>, Std.Dev <dbl>,
#> # Coef.Var <dbl>, SE <dbl>, Skewness <dbl>, Kurtosis <dbl>, IQR <dbl>,
#> # MAD <dbl>
问题内容: 我想按值将列表传递给函数。默认情况下,列表和其他复杂对象通过引用传递给函数。这是一些目标: 可以写得短些吗?换句话说,我不想更改 ad 。 问题答案: 您可以使用,但是对于包含列表(或其他可变对象)的列表,您应该使用: 等价于或,并返回列表的浅表副本。 何时使用:
我编写了这个函数,它只是用子字符串替换数据表列中的每个值: 但每次我试着运行它时,我都会发现错误: 现在我已经做了很多关于为什么它不起作用的研究,但我不明白。我读过一些关于标准评估和懒散的东西,但我尝试的似乎都不管用。有什么帮助吗? 谢谢
我有一个关于计算PDF文档摘要以用于数字签名的快速问题(与我前面的一个问题有点相关,我试图弄清楚为什么您需要知道客户的证书以创建正确的摘要)。在Adobe关于PDF格式的文档中,指定了以下内容: 字节范围摘要应在文件中的一个字节范围内计算,该范围应由签名字典中的字节范围条目指示。这个范围应该是整个文件,包括签名字典,但不包括签名值本身(内容条目)。 因此,在这一点上,事情似乎相当简单,只需消化除/
我想通过dplyr::mutate_each将转换应用于所有列,例如。 但是,根据列名,转换应该有参数。因此,列名应该作为附加参数传递给函数 示例:将每列乘以不同的系数: 由于列名在mutate_each期间丢失,我目前通过将一个具有延迟计算的列表传递给mutate_(SE版本)来解决这个问题: 是的,但是有一些特殊的变量,比如。包含的列名的名称。每一次colwise处决?所以我可以做一些
我有一个具有以下结构的数据集: 我想提供一个函数,它允许计算任何值之间的差异,我想这样做使用s这样的函数:(假设参数和作为参数传递) 当然,这不起作用,因为使用非标准评估。我知道现在有一个优雅的解决方案,可以使用来解决这个问题,我已经读过这个小插曲,但我仍然无法理解它。 怎么办? 以下是数据集的前几行,以获得一个可复制的示例
问题内容: 我有一个包含13个不同列名的数据框,我将这些标题分为两个列表。我现在想对每个列表执行不同的操作。 是否可以将列名作为变量传递给pandas?目前,我的代码可以在列表中循环,但是我在尝试将列名传递给函数时遇到了麻烦 码 问题答案: 我认为您可以使用创建自 : 也许更好,因为是,这是由创建: