折叠数据框中的多个级别因素
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
我想将变量 med
和 fed
重新格式化为具有两个级别的因子: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
我有一个包含很多变量的数据框,我想将一些变量重新格式化为具有与相同(有序)因子水平相对应的更多数值的因子。请参阅以下示例:
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
我想将变量 med
和 fed
重新格式化为具有两个级别的因子: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