【问题标题】:Adding a line with rbind changes the nature of columns in data.table in R用 rbind 添加一行会改变 R 中 data.table 中列的性质
【发布时间】:2014-06-19 09:01:13
【问题描述】:

我正在获取一个data.table:

DT <- data.table(num=c(1,4,6,7,8,12,13, 15), let=rep(c("A","B"), each=4))

然后我得到以下结果:

> sapply(DT, class)
    num         let 
"numeric" "character" 

没关系。

然后,添加一行:

DT<-rbind(DT, as.list(c(8, "B")))

然后:

> sapply(DT, class)
    num         let 
"character" "character" 

我发现 R 将第一个列类型更改为字符并且没​​想到会这样……我可以在之后将列更改为数字,但是如果我必须在每次插入后进行检查,那会很痛苦。

有没有没有这个缺点的添加线的方法?

【问题讨论】:

  • rbind(dt, list(8,"B")) 可能是您正在寻找的。 (这篇文章的第二条评论:stackoverflow.com/questions/16652533/…)。
  • 没错,我应该简单地使用list ...我采取了在这个链接上添加一行的方式!谢谢。

标签: r data.table


【解决方案1】:

您的第一个问题源于您使用c,该函数将参数组合成一个向量。这会产生一个原子向量(在这种情况下 - 您正在组合两个长度为一的原子向量,即向量 8 和向量 "B"),它可能只有一种数据类型,因此在您的示例中 c(8,"B") 被评估首先,导致:

str( c(8, "B") )
# chr [1:2] "8" "B"

因此你不应该期待任何其他结果!

【讨论】:

  • 很好的回答我的错误,我在一个只允许一个的结构中混淆了两种数据类型......
  • @ColonelBeauvel np。上面的 Pascals 评论 +1 向您展示了如何规避这一点。顺便说一句,添加两行你可以使用例如rbind(dt, list( 8:9 , c( "A","B") ) ).
猜你喜欢
  • 2013-02-07
  • 2017-06-22
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多