【问题标题】:Invalid Factor Level, NA generated R无效的因子水平,NA 生成 R
【发布时间】:2014-04-29 04:57:17
【问题描述】:

我正在使用的数据示例如下。我已经省略了所有带有“NA”的行。

gss.s[1:5,]
      abany          advfront   arrest
2      YES             Agree       NO
3      YES    Strongly agree       YES
10     YES             Agree       YES
16     YES             Agree       NO
21      NO    Strongly agree       NO

我正在尝试用 abany 列中的 1 替换“YES”,在 abany 列中用 -1 替换“NO”。我尝试使用 replace replace(gss.s[,1], "YES", 1) 但得到错误 Invalid Factor Level, NA generated。我阅读了关于同样问题的先前帖子,但不知道如何将解决方案应用于我的问题。

【问题讨论】:

  • 问题是 1 和 -1 没有被定义为你的因子的水平,它可能只包括 YES 和 NO。您可以将它们添加为级别,或将变量类型重新定义为字符而不是因子。

标签: string r replace numeric


【解决方案1】:

您可以在列上使用ifelse(),一次更改所有值。

gss.s$abany <- ifelse(gss.s$abany == "YES", 1, -1)
gss.s
##    abany       advfront arrest
## 2      1          Agree     NO
## 3      1 Strongly agree    YES
## 10     1          Agree    YES
## 16     1          Agree     NO
## 21    -1 Strongly agree     NO

【讨论】:

  • 另一个快速问题。我将如何替换 advfront 列中的强烈同意 2、同意 1、不同意 -1 和强烈反对 -2。我试着用 ifelse() 一次做一个,但是没有用。这是我所做的 gss.s$advfront
  • 很抱歉没有回复此评论。我一定忘记了。我想你现在已经解决了,因为它是一年半前的事了?
【解决方案2】:
y <- data.frame ("abany"=c("YES","YES","YES","YES","NO"), 
            "advfront"=c("Agree","Strongly Agree","Agree","Agree","Strongly Agree"),
            "arrest"=c("NO","YES","YES","NO","NO"))

我会尝试另一种方式: 将因子列转换为字符

y$abany <- as.character.factor (y$abany)

所以现在更改列的值没有任何问题

y[y$abany=="YES", "abany"] <- 1
y[y$abany=="NO", "abany"] <- -1

【讨论】:

    【解决方案3】:

    您还可以创建一个向量,在其中定义您想要进行的更改。与ifelse 语句相比,如果您拥有大型数据集,则速度要快得多。

    translate <- c(YES=1,NO=-1)
    gss.s$abany2 <- translate[as.character(gss.s$abany)] 
    gss.s
    
    #   abany       advfront arrest abany2
    # 1   YES          Agree     NO      1
    # 2   YES Strongly agree    YES      1
    # 3   YES          Agree    YES      1
    # 4   YES          Agree     NO      1
    # 5    NO Strongly agree     NO     -1
    

    如果您要进行多项更改,您也不必为嵌套的 ifelse 函数而苦恼:

    translate2 <- c('Strongly agree'=2,Agree=1,Disagree=-1,'Strongly disagree'=-2 )
    gss.s$advfront2 <- translate2[as.character(gss.s$advfront)]
    gss.s
    
    #   abany       advfront arrest abany2 advfront2
    # 1   YES          Agree     NO      1         1
    # 2   YES Strongly agree    YES      1         2
    # 3   YES          Agree    YES      1         1
    # 4   YES          Agree     NO      1         1
    # 5    NO Strongly agree     NO     -1         2
    

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 2014-03-21
      相关资源
      最近更新 更多