【发布时间】:2021-07-05 02:53:37
【问题描述】:
我在 R 中创建了一个 for 循环,它根据列表 mention.parkinsons.tags 中包含的变量的值设置变量 mention.parkinsons 的值:
for(i in mention.parkinsons.tags){
nap_analyse <- nap_analyse %>%
mutate(mention.parkinsons = case_when(
mention.parkinsons == TRUE & nap_analyse[i] == TRUE ~ TRUE,
mention.parkinsons == TRUE & nap_analyse[i] == FALSE ~ TRUE,
mention.parkinsons == FALSE & nap_analyse[i] == TRUE ~ TRUE,
mention.parkinsons == FALSE & nap_analyse[i] == FALSE ~ FALSE,))
}
这很好用,但我想创建一个函数,以便可以使用其他变量复制此任务。我的尝试是:
forloop_nap <- function(dataframe, new_var, tags_list) {
for(i in tags_list){
dataframe <- dataframe %>%
mutate({{new_var}} := case_when(
{{new_var}} == TRUE & {{dataframe}}[i] == TRUE ~ TRUE,
{{new_var}} == TRUE & {{dataframe}}[i] == FALSE ~ TRUE,
{{new_var}} == FALSE & {{dataframe}}[i] == TRUE ~ TRUE,
{{new_var}} == FALSE & {{dataframe}}[i] == FALSE ~ FALSE,))
}
我尝试执行 nap_analyse <- forloop_nap(nap_analyse, mention.parkinsons, mention.parkinsons.tags,这将执行原始的 for 循环,但这不起作用。我认为我的语法有问题。编写函数forloop_nap() 的正确方法是什么?
可重现的例子:
library(wakefield)
dataframe <- data.frame(
v1 = r_sample_logical(10, prob = NULL, name = "Logical" ),
v2 = r_sample_logical(10, prob = NULL, name = "Logical" )
)
mention.var.tag <- list(
"v1",
"v2")
dataframe <- add_column(dataframe, mention.parkinsons = FALSE)
for(i in mention.var.tag){
dataframe <- dataframe %>%
mutate(mention.parkinsons = case_when(
mention.parkinsons == TRUE & dataframe[i] == TRUE ~ TRUE,
mention.parkinsons == TRUE & dataframe[i] == FALSE ~ TRUE,
mention.parkinsons == FALSE & dataframe[i] == TRUE ~ TRUE,
mention.parkinsons == FALSE & dataframe[i] == FALSE ~ FALSE,))
}
原始数据框:
> dataframe
v1 v2
1 FALSE FALSE
2 TRUE FALSE
3 TRUE TRUE
4 TRUE FALSE
5 TRUE FALSE
6 FALSE TRUE
7 TRUE FALSE
8 FALSE FALSE
9 TRUE FALSE
10 TRUE TRUE
预期结果(适用于 for 循环,但希望将其编写为函数,以便在其他情况下重现)
v1 v2 mention.parkinsons
1 FALSE FALSE FALSE
2 TRUE FALSE TRUE
3 TRUE TRUE TRUE
4 TRUE FALSE TRUE
5 TRUE FALSE TRUE
6 FALSE TRUE TRUE
7 TRUE FALSE TRUE
8 FALSE FALSE FALSE
9 TRUE FALSE TRUE
10 TRUE TRUE TRUE
【问题讨论】:
-
已编辑问题并尝试包含可重现的示例。