rbind到数据框的因子级别无效

时间:2014-08-13 11:58:46

标签: r

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

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

我希望将其添加到名为。

的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。我想添加行。

3 个答案:

答案 0 :(得分:10)

当你这样做时

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

答案 1 :(得分:0)

我测试了一点,例如: 当尝试使用rbind进行合并时,我们有一个数据帧为df,并有以下6列 第二行到第一行,

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

答案 2 :(得分:0)

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

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