【问题标题】:How to create a new factor based on a current factor?如何基于当前因子创建新因子?
【发布时间】:2014-06-25 15:04:30
【问题描述】:

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

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

我想要创建一个factor2 使得ABECDF。我试过循环,但无法让它工作,但我相信必须有一种优雅的R 方式来做到这一点。

【问题讨论】:

  • 谢谢 Arun,根据您的回复,我需要更具体一些,向所有人道歉。我有一个向量(1 col x 2500 行),其内容可以是美国 50 个州中的任何一个。我想根据这个向量创建一个因子变量,在其中我将 4 个状态(比如 CA、OR、WA、AK)的子集标识/标记为 1,所有其他状态为 0。
  • 有什么理由不简单地用你的标志添加一个新列吗?
  • @RicardoSaporta,是的,这也是我的建议。

标签: r r-factor


【解决方案1】:
 library(car)
 fac2 <- recode( factor1, " c('A', 'B') = 'E';
                            c('C', 'D') = 'F' ")
 fac2

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

注意需要跟踪两种引号和需要使用“;”分组子句之间。 ?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

【讨论】:

  • 重新编码看起来像我需要的!谢谢。成功后我会重新发布。
  • 我希望我能投票更多!感谢此功能recode。还有一个有用的功能!
  • 这是 John Fox 的代码。它曾经几乎是 Rhelp 上的一个常见问题。我只能记住约翰写的东西。
  • 重新编码成功了。当您想在一个因素中将因素组合在一起时,这对于使用因素进行回归非常有帮助。很大的帮助!谢谢。
【解决方案2】:

这是你所期待的吗?

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'))

【讨论】:

  • 我阿伦,谢谢你的帮助,我已经修改了我的问题,我第一次不够具体。
  • @FrankShuster,因子的水平将等于向量中唯一元素的数量。因此,我认为您不能将二进制级别设置为具有 50 个唯一值的向量。为什么不创建一个单独的列,将与这四个值匹配的值设置为1,将其他值设置为0
  • @FrankShuster,这个使用 DWin 示例的编辑可能会满足您的需求..?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多