访问 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 我们特别需要一个表达式。

(感谢您使用可重现的示例进行更新!)