【问题标题】:How do I understand the warnings from rbind?我如何理解来自 rbind 的警告?
【发布时间】:2015-05-03 17:18:29
【问题描述】:

如果我有两个具有相同列名的 data.frame,我可以使用 rbind 来制作一个数据框。但是,如果我有一个是一个因素,另一个是一个 int,我会收到这样的警告:

警告信息:在[<-.factor(*tmp*, ri, value = c(1L, 1L, 0L, 0L, 0L, 1L, 1L, : 无效因子水平,NA产生

以下是问题的简化:

t1 <- structure(list(test = structure(c(1L, 1L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L), .Label = c("False", "True"), class = "factor")), .Names = "test", row.names = c(NA, 
-10L), class = "data.frame")
t2 <- structure(list(test = c(1L, 1L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L
)), .Names = "test", row.names = c(NA, -10L), class = "data.frame")
rbind(t1, t2)

对于单列,这很容易理解,但当它是十几个或更多因素的一部分时,就很难理解了。警告信息告诉我要看哪一列?除此之外,了解哪一列出错的好方法是什么?

【问题讨论】:

  • class(t1$test)factorclass(t2$test)integer。尝试将t2$test 也变成因素。
  • 谢谢帕斯卡。如果这是更大结构的一部分,我怎么知道它是“测试”列?我最初发现它有 18 列,想知道如何简单地找出哪一列变成一个因子。
  • 你需要比较sapply(t1, class)sapply(t2, class)我猜,如果t1t2有相同的列数和相同的列名。
  • @Pascal - 您可能还想在sapply-ing 之前对列名进行排序。 rbind 可以处理无序的名称,但比较将不会对齐 - 例如:sapply(one[sort(colnames(one))],class)
  • @thelatemail 是的,很抱歉没有花时间详细说明。

标签: r rbind


【解决方案1】:

您可以使用classmapply 敲出一个简单的小比较脚本,以比较rbind 会因不匹配的数据类型而崩溃的位置,例如:

one <- data.frame(a=1,b=factor(1))
two <- data.frame(b=2,a=2)

common <- intersect(names(one),names(two))
mapply(function(x,y) class(x)==class(y), one[common], two[common])

#    a     b 
# TRUE FALSE 

【讨论】:

  • 这对于 rbind 来说是一个很好的消息增强,你能提交吗?
【解决方案2】:

根据 thelatemail 的回答,这里有一个比较两个 data.frames 进行 rbinding 的函数:

mergeCompare <- function(one, two) {
  cat("Distinct items: ", setdiff(names(one),names(two)), setdiff(names(two),names(one)), "\n")
  print("Non-matching items:")
  common <- intersect(names(one),names(two))
  print (mapply(function(x,y) {class(x)!=class(y)}, one[common], two[common]))
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多