+-
在编织R标记时,试图使用tidyselect函数创建新的变量时,在mutate_at中出错。

很有可能是我遗漏了一些非常简单的东西,但我无法理解为什么这个错误会在我的mutate_at函数中持续存在。

library(tidyverse)
test = data.frame(diff_1 = sample(0:10, size=20, replace=TRUE),
                  diff_2 = sample(0:10, size=20, replace=TRUE),
                  diff_3 = sample(0:10, size=20, replace=TRUE))
test2 = test %>% mutate_at(.vars = vars(contains("diff_")), .funs = list(cat = ~as.factor(ntile(., 5)))) # create quintiles of variables

我试图使用mutate_at函数在变量名的结尾添加后缀("_cat")来生成新的列,但是当我试图选择包含 "diff_"的变量时,却得到了下面的错误,我无法理解为什么...:'(

Error: `.vars` must be a character/numeric vector or a `vars()` object, not a `data.frame` object

EDIT:

当我分段运行R标记时,重启R后,测试代码就能正常工作了。 但当我试图将整个标记工作簿编织起来时,错误信息依然存在。这意味着我不能直接重启RStudio来解决这个错误。

Quitting from lines 1008-1040 (analysis-complete-case-FIoriginal.Rmd) 
Error: `.vars` must be a character/numeric vector or a `vars()` object, not a `data.frame` object

我已经下载了最新版本的R和RStudio,但仍然没有任何进展:(。我不知道是否有人能说明为什么会出现这个错误信息?是tidyselect函数的问题吗?

谢谢大家

EDIT2:

供参考,这部分的完整代码是:

transposed_cont = mydata_cont %>% 
  pivot_longer(cols=all_of(myvarscont), names_to = "myvars", values_to = "value") %>%
  pivot_wider(names_from = source, values_from = value) %>% 
  mutate(diff_w2w1 = wave2-wave1,
         diff_w3w1 = wave3-wave1) %>% 
  pivot_wider(., id_cols=id, names_from=myvars, values_from=c("wave1", "wave2", "wave3", "diff_w2w1", "diff_w3w1")) %>% # allows you to spread multiple values
  dplyr::select(id, wave1_fi.score, wave2_fi.score, wave1_fp.count, wave2_fp.count, starts_with("diff")) %>% 
  mutate_at(.vars = vars(contains("diff_"), .funs = list(cat = ~as.factor(ntile(., 5)))) ## THIS IS WHERE THE CODE FAILS

问题似乎出在我代码的最后一行 vars(contains("diff_") 当我编织Rmarkdown的时候。目前,我有一个非常粗糙的变通方法,我把变量列成了这样。

tempvars = c(Cs(diff_w2w1_chronic_count, diff_w2w1_cvd_count, diff_w2w1_overnight_num, diff_w2w1_falls_count, diff_w2w1_mmse_errors,  
diff_w2w1_MHcesd,  diff_w2w1_COGimmediaterecall1, diff_w2w1_COGimmediaterecall2, diff_w2w1_COGdelayedrecall, diff_w2w1_bmi,
diff_w3w1_chronic_count, diff_w3w1_cvd_count, diff_w3w1_overnight_num, diff_w3w1_falls_count, diff_w3w1_FRtscore, 
diff_w3w1_mmse_errors, diff_w3w1_moca_errors, diff_w3w1_MHcesd, diff_w3w1_COGimmediaterecall1, diff_w3w1_COGimmediaterecall2, 
diff_w3w1_COGdelayedrecall, diff_w3w1_COGtrail1time, diff_w3w1_COGtrail2time, diff_w3w1_COGtraildeltatime, diff_w3w1_CRTmeancog, 
diff_w3w1_CRTmeanmot, diff_w3w1_CRTmeantot, diff_w3w1_visualAcuityLeft, diff_w3w1_visualAcuityRight, diff_w3w1_bmi, diff_w3w1_FRwhr))

transposed_cont = mydata_cont %>% 
  pivot_longer(cols=all_of(myvarscont), names_to = "myvars", values_to = "value") %>%
  pivot_wider(names_from = source, values_from = value) %>% 
  mutate(diff_w2w1 = wave2-wave1,
         diff_w3w1 = wave3-wave1) %>% 
  pivot_wider(., id_cols=id, names_from=myvars, values_from=c("wave1", "wave2", "wave3", "diff_w2w1", "diff_w3w1")) %>% # allows you to spread multiple values
  dplyr::select(id, wave1_fi.score, wave2_fi.score, wave1_fp.count, wave2_fp.count, starts_with("diff")) %>% 
  mutate_at(.vars = tempvars, .funs = list(cat = ~as.factor(ntile(., 5)))) # create quintiles of variables

我可以用这个粗糙的变通方法来编织输出结果 但如果能知道为什么我的第一次尝试失败了,对将来的参考会很有帮助。