如何根据当前因素创建新因子?

时间:2013-02-12 20:45:07

标签: r r-factor

R中,我要做的是通过在另一个因子或字符串中“分组”值来创建一个因子。

    factor1 <- as.factor(c("A","B","C","D"))

我想要的是创建一个factor2A&amp; BEC&amp; DF。我已经尝试过循环而无法让它工作但是相信必须有一种优雅的R方法来实现这一点。

2 个答案:

答案 0 :(得分:3)

 library(car)
 fac2 <- recode( factor1, " c('A', 'B') = 'E';
                            c('C', 'D') = 'F' ")
 fac2

# [1] E E F F
Levels: E F

注意需要跟踪两种报价并需要使用“;”分组条款之间。还有一个'else'参数,?car::recode的帮助页面将描述。对于修订后的问题,recode策略可行,但这也会成功:

fac2 <- 0 + factor1 %in%  c('CA', 'OR', 'WA', 'AK')  # numeric result
fac2 <- factor(fac2) # factor result which displays like a character vector

请注意,state.abb实际上是一个系统常量,尽管它是字符向量而不是因子:

 sts <- state.abb[sample(50)]   # a scrambled version
 sts[ sts %in% c('CA', 'OR', 'WA', 'AK')]
#[1] "CA" "AK" "OR" "WA"

对于car :: recode的使用,此代码成功(注意recode如果给出一个因子作为输入,则返回一个因子,我没有这样做:

 recode(sts, " c('CA', 'OR', 'WA', 'AK') = 1; else=0")
#-------
 [1] 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1
[45] 0 0 0 0 0 0

答案 1 :(得分:1)

这是你期待的吗?

factor2 <- factor1
levels(factor2) <- rep(c("E","F"), each=2)

# [1] E E F F
# Levels: E F

使用@Ddin的例子,我会做这样的事情:

set.seed(2)
sts <- state.abb[sample(50)]
# your factor1 would be
factor1 <- factor(sts)
# you would construct factor2 as 
factor2 <- factor(0 + factor1 %in% c('CA', 'OR', 'WA', 'AK'))