访问 dplyr 用户定义函数中的变量属性
Access variable attributes inside dplyr user defined function
我正在尝试创建一个函数来计算调查数据的加权平均值,其中变量名称取自变量属性。
我导入了一个数据集,其中每个变量都有一个标签
这是一个可重现的例子:
random_df<- data.frame(replicate(5,sample(0:1,10,rep=TRUE)))
attr(random_df$X1, 'label') <-"Age"
attr(random_df$X2, 'label') <-"Gender"
attr(random_df$X3, 'label') <-"Occupation"
attr(random_df$X4, 'label') <-"Nationality"
attr(random_df$X5, 'label') <-"Education"
我想创建一个函数来计算加权平均值并根据标签命名变量。我尝试了以下
my_function<- function(var, ...){
var<-enquo(var)
group_var <- enquos(...)
df <-random_df
label<-attr(df$!!var,'label')
df %>%
filter(!is.na(!!var))%>%
group_by(!!!group_var) %>%
count(!!var) %>%
mutate(freq=n/sum(n)) %>%
mutate(!!label:=percent(freq))
}
然而,这给了我一个错误 Error: unexpected '!' in:" label<-attr(df$!"
。有人知道如何修复代码吗?
试试这个:
my_function<- function(var, ...){
var <- enexpr(var) # use expression, not quosure
group_var <- enquos(...)
df <-random_df
label<-attr(df[[as.character(var)]],'label') # use as.character, not unquoting
df %>%
filter(!is.na(!!var))%>%
group_by(!!!group_var) %>%
count(!!var) %>%
mutate(freq=n/sum(n)) %>%
mutate(!!label:=percent(freq))
}
我们使用 df[[as.character(var)]]
而不是 df$!!var
,因为在 this case 中使用 !!
取消引用失败。另请注意,您可能需要表达式,而不是这里的 quosures。对于 as.character
我们特别需要一个表达式。
(感谢您使用可重现的示例进行更新!)
我正在尝试创建一个函数来计算调查数据的加权平均值,其中变量名称取自变量属性。 我导入了一个数据集,其中每个变量都有一个标签 这是一个可重现的例子:
random_df<- data.frame(replicate(5,sample(0:1,10,rep=TRUE)))
attr(random_df$X1, 'label') <-"Age"
attr(random_df$X2, 'label') <-"Gender"
attr(random_df$X3, 'label') <-"Occupation"
attr(random_df$X4, 'label') <-"Nationality"
attr(random_df$X5, 'label') <-"Education"
我想创建一个函数来计算加权平均值并根据标签命名变量。我尝试了以下
my_function<- function(var, ...){
var<-enquo(var)
group_var <- enquos(...)
df <-random_df
label<-attr(df$!!var,'label')
df %>%
filter(!is.na(!!var))%>%
group_by(!!!group_var) %>%
count(!!var) %>%
mutate(freq=n/sum(n)) %>%
mutate(!!label:=percent(freq))
}
然而,这给了我一个错误 Error: unexpected '!' in:" label<-attr(df$!"
。有人知道如何修复代码吗?
试试这个:
my_function<- function(var, ...){
var <- enexpr(var) # use expression, not quosure
group_var <- enquos(...)
df <-random_df
label<-attr(df[[as.character(var)]],'label') # use as.character, not unquoting
df %>%
filter(!is.na(!!var))%>%
group_by(!!!group_var) %>%
count(!!var) %>%
mutate(freq=n/sum(n)) %>%
mutate(!!label:=percent(freq))
}
我们使用 df[[as.character(var)]]
而不是 df$!!var
,因为在 this case 中使用 !!
取消引用失败。另请注意,您可能需要表达式,而不是这里的 quosures。对于 as.character
我们特别需要一个表达式。
(感谢您使用可重现的示例进行更新!)