在R
中,我想做的是通过在另一个因子或字符串中“分组”值来创建一个因子。
factor1 <- as.factor(c("A","B","C","D"))
我想要的是创建一个factor2
这样的A
& B
areE
和C
& D
are F
。我尝试过循环,但无法让它工作,但相信必须有一种优雅的R
方式来做到这一点。
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
这是你所期待的吗?
factor2 <- factor1
levels(factor2) <- rep(c("E","F"), each=2)
# [1] E E F F
# Levels: E F
使用@DWin 的例子,我会做这样的事情:
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'))