【问题标题】:Behavior of identical() in apply in R在 R 中应用相同()的行为
【发布时间】:2017-11-09 23:20:39
【问题描述】:

这很奇怪。

apply( matrix(c(1,NA,2,3,NA,NA,2,4),ncol = 2), 1, function(x) identical(x[1], x[2]) )
#[1] FALSE  TRUE  TRUE FALSE
apply( data.frame(a = c(1,NA,2,3),b = c(NA,NA,2,4)), 1, function(x) identical(x[1], x[2]) )
#[1] FALSE FALSE FALSE FALSE
apply( as.matrix(data.frame(a = c(1,NA,2,3),b = c(NA,NA,2,4))), 1, function(x) identical(x[1], x[2]) )
#[1] FALSE FALSE FALSE FALSE

这是由于下面 joran 指出的名称属性。我可以通过以下方式获得我期望的结果:

apply( data.frame(a = c(1,NA,2,3),b = c(NA,NA,2,4)), 1, function(x) identical(unname(x[1]), unname(x[2])) ) 

或:

apply( data.frame(a = c(1,NA,2,3),b = c(NA,NA,2,4)), 1, function(x) identical(x[[1]], x[[2]]) ) 

有没有更自然的方法来解决这个问题?似乎应该有一个忽略属性的选项,就像在 all.equal() 中一样。

【问题讨论】:

  • 数据框版本的列名保留在索引下。
  • 好的,所以这符合我的预期:apply(data.frame(a = c(1,NA,2,3),b = c(NA,NA,2,4)), 1, function(x) same(unname(x[1]), unname(x[2])) ) 但是为什么没有这个选项,就像在 all.equal 中一样?

标签: r compare apply


【解决方案1】:

大概

mapply(identical, x$a, x$b)
#[1] FALSE  TRUE  TRUE FALSE 

其中x 是一个数据框。

顺便说一句,将apply 与数据框一起使用几乎总是一个错误。它会将数据框强制转换为矩阵,这通常会导致意想不到的结果。

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多