【问题标题】:is it possible to subset a data.frame based on a row range AND a logical condition in r? [duplicate]是否可以根据行范围和 r 中的逻辑条件对 data.frame 进行子集化? [复制]
【发布时间】:2020-12-25 16:12:26
【问题描述】:

在 base r 中,我可以根据行范围对 data.frame 进行子集化:

mtcars[1:5,]

或者我可以根据逻辑条件进行子集化:

mtcars[mtcars$cyl==6,]

但我似乎不能同时做到这两点:

mtcars[1:5 & mtcars$cyl==6,]

警告信息:在 1:5 & mtcars$cyl == 6 中:较长的对象长度不是较短对象长度的倍数

还有其他方法吗?

用例是使用 LaF 包加载一个巨大的 .csv,它允许使用类似于 base r 的命令进行过滤,但使用行范围比使用条件加载内容要快得多,并且添加多个条件意味着我有时需要等待一天才能加载数据。

【问题讨论】:

    标签: r


    【解决方案1】:

    如果您以交互方式工作,我会使用subset

    subset(mtcars[1:5,], cyl==6)
    #                mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    

    或者存储中间结果。

    tt <- mtcars[1:5,]
    tt[tt$cyl==6,]
    rm(tt)
    

    或者,您可以链接您的两个条件。

    mtcars[(1:5)[mtcars$cyl[1:5]==6],]
    #mtcars[1:5,][mtcars$cyl[1:5]==6,] #Alternative
    #mtcars[1:5,][mtcars[1:5,]$cyl==6,] #Alternative
    

    或存储1:5 在这种情况下我会推荐的内容。

    i <- 1:5
    mtcars[i[mtcars$cyl[i]==6],]
    rm(i)
    

    【讨论】:

    • 这些是很好的答案,但对于这个涉及读取非常大文件的用例,我无法复制数据。我不确定 LaF 是否接受子集命令,但会检查一下。
    • 也许你试试i &lt;- 1:5; mtcars[i[mtcars$cyl[i]==6],]
    【解决方案2】:

    您可以使用任何一种方式进行子集化。

    1. 基于逻辑向量:
    mtcars[seq(nrow(mtcars)) %in% 1:5 & mtcars$cyl==6,]
    
    #                mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
    #Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
    #Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    
    1. 基于行范围:
    mtcars[intersect(1:5, which(mtcars$cyl==6)),]
    

    【讨论】:

    • 您知道其中哪一个可能更快吗?诀窍是找到一种方法让 LaF 仅在行范围内搜索,而不必计算完整的数据集(即 30 GB)。我担心 nrow() 可能会迫使它这样做。
    • 是的,在第一个选项中,我们正在生成从 1 到 nrow 的序列,这可能效率不高。您可以使用intersect 方法。更好的是mtcars[intersect(1:5, which(mtcars$cyl[1:5]==6)),]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多