在dplyr中重新编码和Mutate_all

5 r dplyr

我正在尝试使用recode和mutate_all来重新编码列.但是,出于某种原因,我收到了一个错误.我相信这篇文章类似于如何使用dplyr重新编码(和反向代码)列中的变量,但该帖子中的答案使用了lapply函数.

这是我在阅读dplyr软件包的帮助pdf后尝试的内容.

by_species<-matrix(c(1,2,3,4),2,2)
tbl_species<-as_data_frame(by_species)
tbl_species %>% mutate_all(funs(. * 0.4))
# A tibble: 2 x 2
     V1    V2
  <dbl> <dbl>
1   0.4   1.2
2   0.8   1.6
Run Code Online (Sandbox Code Playgroud)

所以,这很好用.

但是,这不起作用:

grades<-matrix(c("A","A-","B","C","D","B-","C","C","F"),3,3)
tbl_grades <- as_data_frame(grades)
tbl_grades %>% mutate_all(funs(dplyr::recode(.,A = '4.0')))
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

    Error in vapply(dots[missing_names], function(x) make_name(x$expr), character(1)) : 
values must be length 1,
but FUN(X[[1]]) result is length 3
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下问题是什么以及为什么上面的代码不起作用?

我很感激任何帮助.

谢谢

MrF*_*ick 7

@Mir在描述问题方面做得很好.这是一种可能的解决方法.由于问题在于生成名称,因此您可以提供自己的名称

tbl_grades %>% mutate_all(funs(recode=recode(.,A = '4.0')))
Run Code Online (Sandbox Code Playgroud)

现在这确实添加了列而不是替换它们.这是一个"忘记"你提供这些名字的功能

dropnames<-function(x) {if(is(x,"lazy_dots")) {attr(x,"has_names")<-FALSE}; x}
tbl_grades %>% mutate_all(dropnames(funs(recode=dplyr::recode(.,A = '4.0'))))
Run Code Online (Sandbox Code Playgroud)

这应该像原始的一样.虽然真的

tbl_grades %>% mutate_all(dropnames(funs(recode(.,A = '4.0'))))
Run Code Online (Sandbox Code Playgroud)

因为dplyr经常有某些函数的特殊c ++版本,如果它能识别函数(lag例如),它可以使用,但如果你还指定了命名空间(如果你使用的话),这种情况就不会发生dplyr::lag.

  • @Tower_Watch你能改变那个问题的标题吗?像命名空间函数的"funs()"错误更具描述性" (3认同)