【问题标题】:Removing zero lines from dataframe yields dataframe of zero lines从数据帧中删除零线会产生零线的数据帧
【发布时间】:2011-05-27 16:24:11
【问题描述】:

我有一个包含一堆质量控制校验和的脚本,它被捕获在一个数据集上,由于质量控制而无需删除任何样本(行)。但是,这个脚本给了我一个零行数据框的意外结果。使用示例数据,为什么会这样:

data(iris)
##get rid of those pesky factors
iris$Species <- NULL
med <- which(iris[, 1] < 4.9)
medtemp <- iris[-med, ]
dim(medtemp)
[1] 134   4

但这会返回一个零行的数据框:

small <- which(iris[, 1] < 4.0)
smalltemp <- iris[-small, ]
dim(smalltemp)
[1] 0 4

这样:

x <- 0
zerotemp <- iris[-x, ]
dim(zerotemp)
[1] 0 4

似乎smalltemp 数据框的大小应该与iris 相同,因为根本没有要删除的行。这是为什么呢?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    从 Patrick Burns 的R Inferno 逐字复制。 41(我希望这构成“合理使用”——如果有人反对,我会删除它)

    消极无所谓

    > x2 <- 1:4
    > x2[-which(x2 == 3)]
    [1] 1 2 4
    

    上面的命令返回x2中所有不等于3的值。

    > x2[-which(x2 == 5)]
    numeric(0)
    

    希望上面的命令返回所有的x2,因为没有元素是 等于 5。现实会打破这个希望。相反,它返回一个长度向量 零。 以下两个陈述之间存在细微差别:

    x[]
    x[numeric(0)]
    

    输入的细微差别,但输出的差别没有细微差别。 原始问题至少有三种可能的解决方案。

    out <- which(x2 == 5)
    if(length(out)) x2[-out] else x2
    

    另一种解决方案是使用逻辑下标:

    x2[!(x2 %in% 5)]
    

    或者,从某种意义上说,你可以倒退:

    x2[ setdiff(seq along(x2), which(x2 == 5)) ]
    

    【讨论】:

    • 总是很高兴看到引用的 R Inferno,这个答案意味着它可能是再次查看它的好时机。
    【解决方案2】:

    在您的第二个示例中,small 的计算结果是否为 0?

    取向量的第零个元素总是返回空向量:

    > foo <- 1:3
    > foo
    [1] 1 2 3
    > foo[0]
    integer(0)
    > 
    

    【讨论】:

      【解决方案3】:

      我不会使用which 来获取您的索引,而是使用布尔向量并将其取反。这样你就可以这样做了:

      small <- iris[, 1] < 4.0
      smalltemp <- iris[!small, ]
      dim(smalltemp)
      [1] 150   4
      

      编辑:我不认为 0 的负索引(如您的情况)是允许的,因为没有第 0 个索引,因此 R 不能从您的选择中排除该索引。负索引可以解释为:“将所有行还给我,除了那些有这些索引的行”。

      【讨论】:

        【解决方案4】:

        这是因为如何处理零索引的规则。只允许严格为正或严格为负的索引。因为[0] 什么都不返回,并且

        R> -0 == 0
        [1] TRUE
        

        因此,在你期望它丢弃什么的地方你什么也得不到。

        identical(0) 问题被视为由NULL 编制索引,据记录,这就像由0 编制索引一样工作,因此行为相同。

        这在R Language Definition manual中讨论

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-19
          • 2019-04-05
          • 2018-12-03
          • 1970-01-01
          • 2021-03-23
          • 2018-01-23
          • 2018-06-18
          相关资源
          最近更新 更多