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