【问题标题】:Assigning a list to data frame - getting an error: invalid factor level, NA generated将列表分配给数据框 - 出现错误:无效因子级别,NA 生成
【发布时间】:2016-10-28 20:03:08
【问题描述】:

我正在循环内创建一个数字和字符列表,并将该列表分配给数据框。我已经事先定义了每个变量,并且我没有使用因子(至少我是这样认为的)。基本上,我想用我提到的变量创建一个数据框。这是我正在尝试使用的代码:

NumToShow    = numeric(0)
MatToShow    = character()
flag         = numeric(0)

datalist = data.frame(NumToShow,MatToShow,flag)

for (i in 1:3){
  NumToShow = i
  MatToShow = "aaa"
  flag = i^2

  Row_i = list(NumToShow,MatToShow,flag)
  # Combining all the data
  datalist[i,] = Row_i
}

我收到错误消息:

In `[<-.factor`(`*tmp*`, iseq, value = "aaa") :
  invalid factor level, NA generated

我不确定我为什么会得到它。任何帮助将不胜感激。如果这是愚蠢的事情,我很抱歉。谢谢你:)

【问题讨论】:

  • 这更多的是警告而不是错误。在datalist 中,MatToShow 是一个因素。在循环期间,您为其分配值,这些值不是levels(MatToShow) 的元素。这些值变为NA。解决方案:将值添加到 levels(MatToShow) 或使用 character 向量而不是 factors,例如通过指定data.frame(NumToShow,MatToShow,flag, stringsAsFactors=FALSE).
  • 这是一种将数据逐行添加到 data.frame 中的非常糟糕的模式。在这个简单的例子中你可以做data.frame(NumToShow=1:3, MatToShow="aaa", flag=(1:3)^2)。但最好描述一下你真正想做的事情。 R中可能有更好的方法
  • ?data.frame,然后查看参数stringsAsFactors。我自己也经常犯同样的错误。
  • Flick 先生,我将创建另一个帖子并准确解释我想要做什么。感谢您的建议

标签: r list dataframe error-handling


【解决方案1】:

查看?data.frame():

data.frame(..., row.names = NULL, check.rows = FALSE,
           check.names = TRUE, fix.empty.names = TRUE,
           stringsAsFactors = default.stringsAsFactors())

然后输入:

default.stringsAsFactors()
# [1] TRUE

您需要明确设置stringsAsFactors = FALSE 以使data.frame() 不将字符视为因素。

【讨论】:

  • 谢谢!这可行:) 将来,我会更加小心地检查函数中的默认值。
猜你喜欢
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多