可以使用的概念,即布爾檢查矢量:
x <- c(0.1, 0.3, 0.5, 0.2)
x < 0.5
# [1] TRUE TRUE FALSE TRUE
和一些grep
結果:
grep('Condition', names(DF1))
要做這個子集NG可以使用apply
生成您的布爾向量:
keepers <- apply(DF1[, grep('Condition', names(DF1))], 1, function(x) any(x < 0.5))
和其子集:
DF1[keepers,]
注意,這不一定返回的數據結構,你在你的問題顯示。但是您可以使用all
或不同的閾值相應地更改匿名函數。
代替編輯,我會以不同的方式處理。我會用melt
從reshape2
包:
library(reshape2)
dat.c <- melt(DF1,
id.var='List_name',
measure.var=grep('Condition', names(DF1), value=TRUE),
variable.name='condition',
value.name='cond.val')
dat.c$idx <- gsub('Condition', '', dat.c$condition)
dat.s <- melt(DF1,
id.var='List_name',
measure.var=grep('Situation', names(DF1), value=TRUE),
variable.name='situation',
value.name='situ.val')
dat.s$idx <- gsub('Situation', '', dat.s$situation)
dat <- merge(dat.c, dat.s)
out <- dat[dat$cond.val < 0.5,]
List_name idx condition cond.val situation situ.val
1 List1 1 Condition1 0.01 Situation1 66
2 List1 2 Condition2 0.12 Situation2 123
3 List2 1 Condition1 0.23 Situation1 45
4 List2 2 Condition2 0.22 Situation2 -34
5 List3 1 Condition1 0.32 Situation1 13
6 List3 2 Condition2 0.23 Situation2 -12
7 List4 1 Condition1 0.03 Situation1 -3
10 List5 2 Condition2 0.05 Situation2 100
12 List6 2 Condition2 0.09 Situation2 32
然後可以使用dcast
把數據傳回在最初的格式,如果你想要的,但我覺得在這個「長」表單數據更容易的工作。這種形式也是令人愉快的,因爲它避免了NA值的需要,當你有行滿足一個條件而其他條件不滿足時。
out.c <- dcast(out, List_name ~ condition, value.var='cond.val')
out.s <- dcast(out, List_name ~ situation, value.var='situ.val')
merge(out.c, out.s)
List_name Condition1 Condition2 Situation1 Situation2
1 List1 0.01 0.12 66 123
2 List2 0.23 0.22 45 -34
3 List3 0.32 0.23 13 -12
4 List4 0.03 NA -3 NA
5 List5 NA 0.05 NA 100
6 List6 NA 0.09 NA 32
如果要是條件在條件1滿足,而不是CONDITION2 ...例如List4過濾?你會爲所有情況拿走4號線嗎?我沒看到列情境2 ..這是一個類型錯誤? – agstudy 2013-02-12 15:17:45
哦,對不起,我犯了一個錯誤!我編輯! – Fuv8 2013-02-12 15:22:24
爲什麼List4在輸出列表中?條件2有0.56,這是> 0.5。 – prabhasp 2013-02-12 15:24:39