我希望有人可以帮助我解决创建函数的问题。我正在使用的数据集包含调查答复,每个问题(Q1,Q2等)的列以及每行的答复。该功能必须能够选择列(Q1,Q2等),然后从该列中筛选出一个特定的响应,以便它可以对其进行计数。
我正在尝试编写一个函数,允许您包含要选择的问题编号作为参数之一。这是代码:
my_function <- function(survey, question_number) {
selected_question <- survey %>%
select(question_number)
everyday_responses <- selected_question %>%
filter(question_number == "Every day") %>%
count()
这适用于选择列,但不适用于该列中的过滤。我已经知道这是因为我必须将question_number参数输入为“ Q1”(在其周围加上引号)。这导致filter(question_number ==“ Everyday”)行无法正常运行,因为这期望没有“”(Q1而不是“ Q1”)的列名。
有人可以解释为什么会发生这种情况并可能提出解决方案吗?我对使用R很陌生,所以我可能会完全缺少一些东西。
非常感谢:D
答案 0 :(得分:0)
通常,select
和pull
可以同时使用原始列名称(Q1)和字符串列名称(“ Q1”),但是filter
,mutate
,.. 。期望原始列名。
假设您真的只对问题中“每天”的数量感兴趣,那么您可以对基数R进行操作:
my_function_base <- function(survey, question_number) {
sum(survey[[question_number]] %in% "Every day")
}
my_function_base(my_df, "Q2")
# [1] 1
有几种方法可以修复dplyr函数,但这是两个选项。
library(dplyr)
使用字符串输入
my_function_str <- function(survey, question_number) {
survey %>%
filter_at(question_number, ~ . == "Every day") %>%
count()
}
my_function_str(my_df, "Q2")
# A tibble: 1 x 1
# n
# <int>
# 1 1
filter_at
使用字符串作为输入,然后在指定的列进行过滤。
使用NSE:另请参见:https://dplyr.tidyverse.org/articles/programming.html
my_function_nse <- function(survey, question_number) {
question_number <- enquo(question_number)
survey %>%
filter(!!question_number == "Every day") %>%
count()
}
my_function_nse(my_df, Q1) # No quotes around Q1
# A tibble: 1 x 1
# n
# <int>
# 1 2
数据
my_df <- data.frame(Q1 = c("Every week", "Every day", "Every week", "Every day"),
Q2 = c("Every week", "Every week", "Every week", "Every day"))
答案 1 :(得分:0)
@ zx8754共享的链接应该可以帮助您解决问题。考虑到您说自己是R
的新手,因此可以修改函数。
my_function <- function(df, col) {
df %>%
select(col) %>%
filter((!!as.symbol(col))=="Every day") %>%
count()
}
# This is how you call your function
my_function(df, "Q1")
在df
您的数据帧中,我认为它称为survey
,而col
是您要过滤到的列。
希望有帮助。