这种向数据帧添加行的方式有什么问题?

时间:2014-06-25 18:05:33

标签: r dataframe

data <- data.frame(A= character(0), B= character(0))
data[1, ] <- c("AA", "BB")


Warning messages:

1: In `[<-.factor`(`*tmp*`, iseq, value = "AA") :

  invalid factor level, NA generated

2: In `[<-.factor`(`*tmp*`, iseq, value = "BB") :

  invalid factor level, NA generated
> data
     A    B
 1   NA NA

3 个答案:

答案 0 :(得分:1)

尝试:

data <- data.frame(A= character(0), B= character(0), stringsAsFactors=FALSE)
data[1, ] <- c("AA", "BB")

在您的示例中,AB是因素。

答案 1 :(得分:1)

我建议采用与其他答案不同的方法。如果A和B之类的名称或ID号都是唯一的,那么将它们视为字符串就可以了,其他答案也没问题。但是如果A和B是分类变量,你将变成因子(要么是你自己,要么是在传递给需要因子的函数时通过自动转换),那么预先创建因子并指定开始的等级是有好处的。

> mydata <- data.frame( A=factor(levels=c('A','AA','AAA')), 
+ B=factor(levels=c('BB','CC','DD')) )
> mydata[1,] <- c('AA','BB')
> mydata[2,] <- c('A','bb')
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = "bb") :
  invalid factor level, NA generated
> mydata
   A    B
1 AA   BB
2  A <NA>
> 

请参阅,如果您将列设置为因子并设置有效级别,那么添加正确的行会执行正确的操作,但如果您在输入行时输入错误,则会收到有用的警告消息让你知道你做错了什么并预先修好,而不是等待在分析时被它蜇伤。这也允许您指定因子级别的顺序,而不是使用默认的字母顺序。

答案 2 :(得分:0)

假设您使用默认stringsAsFactors=TRUE开始(以&#39; stringsAsFactors = FALSE&#39;开头更安全)

 data <- data.frame(A= factor(character(0),levels=c("AA","AA2")), B= factor(character(0),levels=c("BB","BB2")))
 data
 #[1] A B
 #<0 rows> (or 0-length row.names)
data[1,] <- c("AA","BB")
data
#  A  B
#1 AA BB
data[2:3,] <- c("AA","AA2","BB","BB2")
data
#   A   B
# 1  AA  BB
# 2  AA  BB
# 3 AA2 BB2