折叠数据框中的多个级别因素

Collapse multiple level factors within dataframe

我有一个包含很多变量的数据框,我想将一些变量重新格式化为具有与相同(有序)因子水平相对应的更多数值的因子。请参阅以下示例:

mydf <- data.frame(replicate(3,sample(0:2,10,replace=TRUE)))
mydf[6, ] <- c(NA, NA, 2)
names(mydf) <- c("med", "fed", "id")

mydf
   med fed id
1    2   2  1
2    0   0  0
3    0   1  0
4    0   1  2
5    1   0  2
6   NA  NA  2
7    0   1  2
8    0   2  0
9    0   0  2
10   2   2  2

我想将变量 medfed 重新格式化为具有两个级别的因子:0 - "foo"、1,2 - "bar" 其中 "foo" < "bar"。我知道我可以按照提示 here:

对变量单独进行
mydf$med <- `levels<-`(factor(mydf$med, ordered=TRUE), list("foo"=0, "bar"=c(1,2)))
mydf$fed <- `levels<-`(factor(mydf$fed, ordered=TRUE), list("foo"=0, "bar"=c(1,2)))

mydf
    med  fed id
1   bar  bar  1
2   foo  foo  0
3   foo  bar  0
4   foo  bar  2
5   bar  foo  2
6  <NA> <NA>  2
7   foo  bar  2
8   foo  bar  0
9   foo  foo  2
10  bar  bar  2 

table(mydf$med)
foo bar 
  6   3 

有没有办法对每个匹配某种模式的变量一次性完成?例如。使用 dplyr 有点像

mydf %>% mutate_each(funs(???), matches("ed$"))

正如 David Arenburg 指出的那样,解决方案很明显,使用 dplyr 和单变量情况的提示(使用更简单的多行公式)。

library(dplyr)
myfunc <- function(x) {
    x <- factor(x, ordered=TRUE)
    levels(x) <- list("foo"=0, "bar"=c(1,2))
    x
}

mydf <- mydf %>% mutate_each(funs(myfunc), matches("ed$"))
mydf
    med  fed id
1   bar  bar  1
2   foo  foo  0
3   foo  bar  0
4   foo  bar  2
5   bar  foo  2
6  <NA> <NA>  2
7   foo  bar  2
8   foo  bar  0
9   foo  foo  2
10  bar  bar  2 

table(mydf$med)
foo bar 
  6   3