按多列过滤R data.frame

时间:2016-08-24 19:06:19

标签: r

我有一个R数据框,其中包含许多观察结果,如下所示:

df <- data.frame(obs1=c(7.1,8.3,9.8), 
                 obs2=c(5.2,8.8,4.1), 
                 obs3=c(9.6,8.1,7.7), 
                 obs4=c(7.2,8.1,9.4), 
                 obs5=c(NA,5.4,9.0), 
                 hi1=c(9.6,8.8,9.8), 
                 hi2=c(7.2,8.3,9.4))

我简化了,因为obs出去了obs25。 hi1和hi2包含每行中的最高值和次高值。我需要获得obs* > x但小于hi1或hi2的所有行。换句话说,所有行的值都高于阈值但不是2个最高值。谢谢!

抱歉没有更清楚。例如,如果阈值设置为8并且使用上面的数据帧,则结果将是第2行和第3行:

第2行中的

,obs3和obs4> 8,但不到2最高

在第3行,obs5&gt; 8,但不到2最高

2 个答案:

答案 0 :(得分:1)

请注意,没有符合您似乎描述的标准的行(在此示例中):

df <- data.frame(obs1=c(7.1,8.3,9.8), 
                 obs2=c(5.2,8.8,4.1), 
                 obs3=c(9.6,8.1,7.7), 
                 obs4=c(7.2,8.1,9.4), 
                 obs5=c(NA,5.4,9.0), 
                 hi1=c(9.6,8.8,9.8), 
                 hi2=c(7.2,8.3,9.4))

x <- 5

#rows which have a min value greater than x
df[which(apply(df[,-c(6:7)], 1, min) > x,),]

#rows which have a max value less than h2
df[which(apply(df[,-c(6:7)], 1, max) < df$h12,),]

#rows which have both
df[intersect(which(apply(df[,-c(6:7)], 1, min) > x,), which(apply(df[,-c(6:7)], 1, max) < df$h12,)),]

答案 1 :(得分:0)

我想在这里探讨一种可能性,并且找到相对小于两个最高列的列,每个列各自的行元素,并且小于阈值,这也是比较元素的向量按元素。以下示例添加了一些观察结果,因此我们实际上可以看到一些结果:

df <- data.frame(obs1=c(7.1,8.3,9.8), 
               obs2=c(5.2,8.8,4.1), 
               obs3=c(9.6,8.1,7.7), 
               obs4=c(7.2,8.1,9.4), 
               obs5=c(NA,5.4,9.0),
               obs6=c(6.6,7.3,8.8),
               obs7=c(1.1,6.7,9.0),
               obs8=c(8.8,8.4,9.6),
               obs9=c(6.0,7.8,8.3),
               hi1=c(9.6,8.8,9.8), 
               hi2=c(7.2,8.3,9.4))
  

x是我们的阈值,它是一个向量

x <- c(5.0,5.0,5.0)
  

现在我们在每列上应用与两个hi列中最低列的比较,并与阈值进行比较。然后逻辑向量作为产品运行,因此只有在所有元素都为TRUE时才会报告1。 e是我们想要显示的列的逻辑向量。

e <- as.logical(sapply(df, function(y) prod(ifelse(y < df$hi2 & y > x,TRUE,FALSE))>0))
  

按列

对我们的df进行子集化
dfnew <- df[,which(e)]
  

所以,如果我看一下最终结果:

dfnew
  obs6 obs9
1  6.6  6.0
2  7.3  7.8
3  8.8  8.3
相关问题