簡體   English   中英

按多列過濾R data.frame

[英]Filter R data.frame by multiple columns

我有一個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> 8,但最高不到2

請注意,沒有任何行符合您似乎要描述的條件(在此示例中):

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,)),]

我想在這里探討一種可能性,那就是找到相對小於前兩個最高列的列,每個列分別比其各自的行元素小,並且小於閾值,該閾值也是逐元素比較的向量。 下面的示例添加了一些觀察結果,因此我們可以實際看到一些結果:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM