【问题标题】:Reason for unexpected output in subsetting data frame - R子集数据帧中意外输出的原因 - R
【发布时间】:2014-04-18 00:47:30
【问题描述】:

我有数据框“a”,它有一个名为“VAL”的变量。我想统计 VAL 的值为 23 或 24 的元素。

我使用了两个运行良好的代码:

nrow(subset(a,VAL==23|VAL==24) 
nrow(subset(a,VAL %in% c(23,24)))

但是,我尝试了其他代码,它给出了意外的输出,我不知道为什么。

nrow(subset(a,VAL ==c(23,24)))

即使我改变 23 和 24 的顺序,它也会给出不同的意外输出。

nrow(subset(a,VAL ==c(24,23)))

为什么这些代码不正确?他们到底在做什么?

【问题讨论】:

  • 您应该提供一些示例数据。
  • Thelatmail 击败了我,但我想指出您不需要使用subset,而是使用nrow(a[a$VAL==23|a$VAL==24])。有些人更喜欢subset,但我一直喜欢这样做。
  • @CCurtis,您的建议同样低效:无需创建整个 sub-data.frame 然后计算行数。相反,只需使用矢量:sum(a$VAL %in% c(23,24), na.rm = TRUE)
  • @flodel 我从来没有说过这是一种更有效的方法,只是它是一种替代方法。是的,你是对的,创建和求和单个向量而不是在整个数据框中创建和计算行更快。

标签: r subset


【解决方案1】:

通过一个例子可以看出哪里出错了:

a <- data.frame(VAL=c(1,1,1,23,24))
a
#  VAL
#1   1
#2   1
#3   1
#4  23
#5  24

这些工作:

a$VAL %in% c(23,24)
#[1] FALSE FALSE FALSE  TRUE  TRUE
a$VAL==23 | a$VAL==24
#[1] FALSE FALSE FALSE  TRUE  TRUE

比较时由于矢量回收,以下内容不起作用 - 请注意下面的警告消息,例如:

a$VAL ==c(23,24)
#[1] FALSE FALSE FALSE FALSE FALSE
#Warning message:
#In a$VAL == c(23, 24) :
#  longer object length is not a multiple of shorter object length

最后一段代码回收了您正在测试的内容,并且基本上是在比较:

c( 1,  1,  1, 23, 24) #to
c(23, 24, 23, 24, 23)

...所以你不会得到任何返回的行。改变顺序会给你

c( 1,  1,  1, 23, 24) #to
c(24, 23, 24, 23, 24)

...你会得到两行返回(这完全靠运气给出了预期的结果,但它不适合使用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多