【问题标题】:R: I set stringsAsFactors = F, but still get an "invalid factor level, NA generated" errorR:我设置了 stringsAsFactors = F,但仍然收到“无效因子级别,NA 生成”错误
【发布时间】:2014-07-07 23:00:53
【问题描述】:

请问有人可以帮我解决这个问题吗?任何建议都非常感谢!

我开始:

A <- data.frame(stringsAsFactors = F)
A <- edit(A)

然后我为 A 填写了一些值,所以它看起来像这样:

A
  var1  var2
1    a x,y,z
2    b   p,q
3    c   g,h

我的目标是获取这种形式的数据框:

  var1  var2
1    a     x
2    a     y
3    a     z
4    b     p
5    b     q  
6    c     g
7    c     h

这就是我尝试实现它的方式:

A2 <- data.frame(stringsAsFactors = F)
for(i in 1:nrow(A)){
  if(grepl(",", A[i,2])){
    split <- unlist(strsplit(A[i,2], ","))

    for(j in 1:length(split)){
        newrow <- c(A[i,1],split[j])
        A2 <- rbind(A2, newrow)
    }
  }else{
    A2 <- rbind(A2, A[i,])
  }
}

但我收到警告消息:

Warning messages:
1: In `[<-.factor`(`*tmp*`, ri, value = "y") :
  invalid factor level, NA generated
2: In `[<-.factor`(`*tmp*`, ri, value = "z") :
  invalid factor level, NA generated
3: In `[<-.factor`(`*tmp*`, ri, value = "b") :
  invalid factor level, NA generated
4: In `[<-.factor`(`*tmp*`, ri, value = "p") :
  invalid factor level, NA generated
5: In `[<-.factor`(`*tmp*`, ri, value = "b") :
  invalid factor level, NA generated
6: In `[<-.factor`(`*tmp*`, ri, value = "q") :
  invalid factor level, NA generated
7: In `[<-.factor`(`*tmp*`, ri, value = "c") :
  invalid factor level, NA generated
8: In `[<-.factor`(`*tmp*`, ri, value = "g") :
  invalid factor level, NA generated
9: In `[<-.factor`(`*tmp*`, ri, value = "c") :
  invalid factor level, NA generated
10: In `[<-.factor`(`*tmp*`, ri, value = "h") :
  invalid factor level, NA generated

【问题讨论】:

  • 最近有几个问答提供了不同的方式来实现你的目标:例如。 hereherehere

标签: r


【解决方案1】:

您的问题是 stringsAsFactors 不是 data.frame 记住的属性。这仅在初始 data.frame 创建期间使用,并适用于您作为参数传递的所有值。它根本不会影响您将来可能添加的值。

您还会遇到rbinding 到没有列的 data.frame 的问题。 R 喜欢在使用 rbind 时确保列名匹配等,显然情况并非如此。另外,当您将 rbind 转换为 data.frame 时,它​​会将对象转换为 data.frame,然后尝试添加该值,但这次您无法设置 stringsAsFactors,因此它使用默认值 (TRUE)。您将使用字符列显式创建自己的 data.frame。这是您可以重写循环的一种方法

A2 <- data.frame(var1=character(), var2=character(), stringsAsFactors = F)
for(i in 1:nrow(A)){
  if(grepl(",", A[i,2])){
    split <- unlist(strsplit(A[i,2], ","))

    for(j in 1:length(split)){
        newrow <- c(var1=A[i,1],var2=split[j])
        A2 <- rbind(A2, data.frame(as.list(newrow), stringsAsFactors=F))
    }
  }else{
    A2 <- rbind(A2, A[i,])
  }
}

话虽如此,如果您不介意对 data.table 的依赖,cSplit helper function 对这类东西很有用。

你也可以做类似的事情

A2 <- do.call(rbind, with(A, Map(expand.grid, 
     var1 = var1, 
     var2 = strsplit(var2, ",")
)))

使用基函数进行拆分和绑定,无需循环。

【讨论】:

    猜你喜欢
    • 2013-05-25
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 2018-04-29
    • 2019-08-11
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多