【问题标题】:subsetting data frame without using column names不使用列名的子集数据框
【发布时间】:2014-08-28 18:19:10
【问题描述】:

我想知道是否有更好的方法来做到这一点,或者我是否会遇到一些无法预料的麻烦。我需要从数据框中进行子集化,但我不想使用列名。我需要通过引用列号来做到这一点。

data <- data.frame(col1= c(50, 20, NA, 100, 50), 
                   col2= c(NA, 25, 125, 50, NA),
                   col3= c(NA, 100, 15, 55, 25),
                   col4= c(NA, 30, 125, 100, NA),
                   col5= c(80, 25, 75, 40, NA))

假设我想对数据框进行子集化,并在第 5 列中的有效数字之前只保留包含 3 个连续 NA 的行。我能想出的最佳 是这样的:

sub <- data[(which(is.na(data[2]) & 
                   is.na(data[3]) & 
                   is.na(data[4]) & 
                   !is.na(data[5]))), ]

有人发现这有什么问题或知道更好的方法吗?我担心在子集中使用子集,尽管每件事似乎都在正常工作。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    如果您希望稍微压缩代码,可以执行以下操作:

    > data[rowSums(is.na(data[2:4])) == 3 & !is.na(data[5]), ]
      col1 col2 col3 col4 col5
    1   50   NA   NA   NA   80
    

    【讨论】:

    • 为什么不考虑第 1 列?
    • @BondedDust,因为根据他们的代码,这似乎就是 OP 所追求的(尽管他们的描述有点模棱两可)。
    • (+1) 我刚刚晚了 12 分钟完成了这个确切的代码。顺便说一句,soread() 是一个非常有用的功能。 :-)
    • 好的,虽然我想我可以看到传播可能适用于这里。我已经有了一个功能来完成这项工作,但我想我会问一个关于阅读动物园或 xts 屏幕输出的 SO 问题的同源问题的问题。也许可以在扩展的 soread 内进行自动检测?
    猜你喜欢
    • 1970-01-01
    • 2014-07-02
    • 2017-03-18
    • 1970-01-01
    • 2020-05-27
    • 2016-06-18
    • 2018-09-01
    • 2020-11-21
    • 2016-01-13
    相关资源
    最近更新 更多