我正在尝试使用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)
有人可以解释一下问题是什么以及为什么上面的代码不起作用?
我很感激任何帮助.
谢谢
@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.
| 归档时间: |
|
| 查看次数: |
11767 次 |
| 最近记录: |