【问题标题】:Dynamic subseting a dataframe动态子集数据框
【发布时间】:2014-02-21 10:29:13
【问题描述】:

我有一个固定的无数字列和任意数字列的数据框,如下所示:

s <- data.frame(A=c("a","b","c"),B=c(1,2,3), C=c(24,15,2))

我还有两个向量,它们的长度与定义每列的最小值和最大值的数值列数相同。

min <- c(2,10)
max <- c(3,30)

我想用 B 列在 2 到 3 之间,C 列在 10 到 30 之间的所有行对数据框进行子集化。像这样:

s <- s[s$B >= min[1] & s$B <= max[1] & s$C >= min[2] & s$C <= max[2],] 

现在要为任意数量的数字列设置数据帧的子集,我使用 for 语句:

for(i in 1:length(min))
  s <- s[s[,i+1] >= min[i] & s[,i+1] <= max[i],]

这可以完成工作,但速度很慢。我在数据框中有大约 20 列和 150K 行。

有更好的方法吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    一般来说,像这样?

    s <- data.frame(A=sample(letters,100,T),B=sample(1:4,100,T), C=sample(2:40,100,T))
    # larger dataframe
    
    min <- c(2,10)
    max <- c(3,30)
    
      filt<-rowSums(
        sapply(1:length(min),function(x){   # for each item in min (or max)
        s[,x+1]>=min[x] & s[,x+1]<=max[x]   # create a T/F vector
        })
      )==length(min)                        # this returns T for cases where all criteria are met
    
      s[filt,]  # this applies your filter to s
    

    【讨论】:

      猜你喜欢
      • 2021-10-20
      • 1970-01-01
      • 2013-11-19
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多