![](/img/trans.png)
[英]Reshape data.frame with two columns into multiple columns with data (R)
[英]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.