无法将变量传递给R中的函数

时间:2019-02-26 02:41:19

标签: r

我有一个数据框cat_data,其中有一列workclass

> cat_data$workclass
   [1] "State-gov"        "Self-emp-not-inc" "Private"          "Private"          "Private"    ... [ reached getOption("max.print") -- omitted 31561 entries ]

y列是

> cat_data$y
   [1] "<=50K" "<=50K" "<=50K" "<=50K" "<=50K" "<=50K" "<=50K" ">50K"  ">50K"  ">50K"  ">50K"  ">50K"  "<=50K"   ...[ reached getOption("max.print") -- omitted 31561 entries ]

我写了一个脚本来为朴素贝叶斯分析做准备:

library(dplyr)
workclass <- cat_data %>%
  group_by(workclass, y) %>%
  summarise(num = n()) %>%
  spread(y, num) %>%
  ungroup()

它给了我我想要的东西:

> workclass
# A tibble: 9 x 3
  workclass        `<=50K` `>50K`
  <chr>              <int>  <int>
1 ?                   1645    191
2 Federal-gov          589    371
3 Local-gov           1476    617
4 Never-worked           7     NA
5 Private            17733   4963
6 Self-emp-inc         494    622
7 Self-emp-not-inc    1817    724
8 State-gov            945    353
9 Without-pay           14     NA

由于我需要多次相同的数据准备,并且我不想一次又一次地重写此块,因此我决定编写一个函数:

get_frequency <- function(column){
  cat_data %>%
    group_by(column, y) %>%
    summarise(num = n()) %>%
    spread(y, num) %>%
    ungroup()
}

当我尝试workclass <- get_frequency(workclass)时,它抛出了一个错误:

Error: Column `column` is unknown

我该如何解决?

更新:我已经可以修复它。

library(rlang)
get_frequency <- function(column){
  column <- enquo(column)
  column <- cat_data %>%
    group_by(!!column, y) %>%
    summarise(num = n()) %>%
    spread(y, num) %>%
    ungroup()
  return(column)
}
> workclass <- get_frequency(workclass)
> workclass
# A tibble: 9 x 3
  workclass        `<=50K` `>50K`
  <chr>              <int>  <int>
1 ?                   1645    191
2 Federal-gov          589    371
3 Local-gov           1476    617
4 Never-worked           7     NA
5 Private            17733   4963
6 Self-emp-inc         494    622
7 Self-emp-not-inc    1817    724
8 State-gov            945    353
9 Without-pay           14     NA

感谢erveybody!

1 个答案:

答案 0 :(得分:0)

莫里斯·埃弗斯(Mauritus Evers)是正确的,他们是做到这一点的几种方法。我的首选方法(从阅读开始看似乎是最正确的方法)是使用!!包中的rlang运算符,它运作良好,并且还有一个!!!用于解引和拼接向量用于评估的参数,如果您想传递多个列以在group_by中进行评估,这将很方便。这将取消引用参数,并在周围环境中对其进行评估。

过去我做过的一些事情:

    !!中的
  • rlang运算符:这会取消引用参数并在周围环境中对其进行评估
  • eval(parse(text =“ column”)):如调用所示,它将在周围环境中评估已解析的参数。
  • 最后一种方法是使用group_by_函数,该函数是dplyr动词group_by的SE(标准评估)版本,该函数允许Mauritus Evers完全引用。

请记住,是否将字符串“ column”或对象传递给函数很重要。但是尝试这些选项,您将以自己喜欢的方式工作。

示例:

get_frequency <- function(column){
  cat_data %>%
    group_by(!! sym(column), y) %>%
    summarise(num = n()) %>%
    spread(y, num) %>%
    ungroup()
}
get_frequency("column")

或者,如果您不想传递字符串,则

get_frequency <- function(column){
  cat_data %>%
    group_by(!! enquo(column), y) %>%
    summarise(num = n()) %>%
    spread(y, num) %>%
    ungroup()
}

get_frequency(column)