动态子集化数据帧

时间:2014-02-21 10:29:14

标签: r

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

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 statment:

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

这样做但很慢。我在数据框中有大约20列和150K行。

有更好的方法吗?

1 个答案:

答案 0 :(得分: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