【问题标题】:Invalid factor level with rbind to data framerbind 到数据框的因子级别无效
【发布时间】:2014-08-13 11:58:45
【问题描述】:

我是 R 新手,我不知道如何在数据框中添加行。 我添加了两个向量:

b=c("one","lala",1)
d=c("two","lele",2)

我想将它添加到名为 a 的 data.frame 中。

a<-rbind(a,b)

现在我有一个正确的行

      A       B      C
1    one   lala      1

接下来我添加

a<-rbind(a,d)

结果是:

      A       B       C
1    one    lala      1
2     NA      NA      NA

和控制台给我写警告消息:无效因子级别,NA 生成。 我做错了什么或添加新行的更好的简单方法。 但我不想开始创建完整的data.frame。我要加行。

【问题讨论】:

  • 您可以将data.frame a 的列转换为character,然后您应该可以转换为rbind。或者你可以抢占这个,当你创建a 时,也许你可以使用选项stringsAsFactors=FALSE
  • @user20650 哦,你说得对。我把options(stringsAsFactors=FALSE) 和不工作,你的stringsAsFactors=FALSE 工作。谢谢。

标签: r


【解决方案1】:

当你这样做时

c("one","lala",1)

这会创建一个字符串向量。 1 转换为字符类型, 这样向量中​​的所有元素都是相同的类型。

然后rbind(a,b) 将尝试将作为数据框的a 和b 组合起来 这是一个字符向量,这不是你想要的。

执行此操作的方法是将rbind 与数据框对象一起使用。

a <- NULL
b <- data.frame(A="one", B="lala", C=1)
d <- data.frame(A="two", B="lele", C=2)

a <- rbind(a, b)
a <- rbind(a, d)

现在我们可以看到数据框a 中的列是正确的类型。

> lapply(a, class)
$A
[1] "factor"

$B
[1] "factor"

$C
[1] "numeric"

> 

请注意,当您创建不同的数据时,您必须为列命名 框架,否则rbind 将失败。如果你这样做了

b <- data.frame("one", "lala", 1)
d <- data.frame("two", "lele", 2)

然后

> rbind(b, d)
Error in match.names(clabs, names(xi)) : 
  names do not match previous names

【讨论】:

  • 哦,是的。问题是向量,而不是其他。
【解决方案2】:

还有一点,正如我测试的那样,例如: 当尝试使用rbind 组合时,我们有一个数据框作为 df,如下 6 列 第2行到第1行,

df <- data.frame()
df <- rbind(df, row1)
df <- rbind(df, row2)

会这样的

  col1 col2 col3               col4                   col5       col6
1   1   1   Pilot              Greg                Andy Dwyer   95.00
2   1   1   Pilot              Greg                NA           92.00

当我测试时,设置stringsAsFactors = FALSE不仅应该发生在初始化df数据帧上,还应该应用于rbind函数,转换为以下:

df <- data.frame(stringsAsFactors = FALSE)
df <- rbind(df, row1, stringsAsFactors = FALSE)
df <- rbind(df, row2, stringsAsFactors = FALSE)

效果很好

  col1 col2 col3               col4                   col5       col6
1   1   1   Pilot              Greg                Andy Dwyer   95.00
2   1   1   Pilot              Greg                Audi Sier    92.00

【讨论】:

    【解决方案3】:

    您需要将stringsAsFactors = FALSE 添加到data.frame() 函数和rbind() 函数中。

    在某些版本的 R 中,rbind() 会自动将字符串转换为因子。例如,在 R 版本 3.6.2 中,rbind 将自动进行因子转换,即使全局设置为 options(stringsAsFactors = FALSE)。在 R 版本 4.0.4 中不是这种情况,因此在 4.0.4 版本中不需要将 stringsAsFactors = FALSE 添加到 rbind() 语句中。

    【讨论】:

      猜你喜欢
      • 2014-02-11
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 2021-06-10
      • 2011-03-31
      • 2022-01-20
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多