假設你的數據看起來有點像這個
set.seed(104)
dd<-data.frame(
a=sample(c(T,F),25, replace=T),
b=sample(c(T,F),25, replace=T),
c=sample(c(T,F),25, replace=T),
d=sample(c(T,F),25, replace=T),
prob = runif(25)
)
collist<-list("a","c","b")
然後這將做你想做的第一部分中的功能是
myfun<-function(N) {
rowmatches <- apply(as.matrix(dd[, unlist(collist[1:N])]), 1, any)
dd[rowmatches, ]
}
有沒有需要動態地構建一個謂詞列表,在這裏我們只提取你是從在data.set要求列,把它變成一個矩陣,然後我們使用apply
可以跨行中的值查看是否有任何值。然後我們返回匹配的行。所以
myfun(1)
# nrow(myfun(1)) == sum(dd$a==T)
# TRUE
返回列a爲真的所有行。並且
myfun(2)
# nrow(myfun(2)) == sum(dd$a==T | dd$c==T)
# TRUE
返回列「a」或「c」爲真的所有行。
然後,如果你想抓住在列表頂部的值,你可以這樣做
result<-myfun(2)
head(result[order(result$prob),], 3)
# a b c d prob
#15 FALSE TRUE TRUE FALSE 0.08670653
#14 TRUE TRUE FALSE FALSE 0.12188057
#16 TRUE TRUE TRUE TRUE 0.13206675
在您使用order()
排序的data.frame和使用head()
提取一定數量的行(在這種情況下是3)。
請提供一些示例數據和您所需的輸出,如下所述:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –