R top n来自排序列表和动态谓词构造

时间:2014-05-13 17:07:43

标签: r list sorting max predicate

我有两个问题:

  1. 设计一个动态R代码函数,它接收参数N(整数)和L(字符列表) 并执行以下操作: 用OR运算符动态地构造谓词作为数字N. 例如,如果N = 2,则谓词为:data.clean.test[j,c(L[[1]])] == TRUE OR data.clean.test[j,c(L[[2]])] 或者如果N = 3,那就是 data.clean.test[j,c(L[[1]])] == TRUE OR data.clean.test[j,c(L[[2]])] == TRUE OR data.clean.test[j,c(L[[3]])] == TRUE 等等...

  2. 从未排序的小数列表中选择前N个结果(0到1之间的概率)

  3. 任何想法?这不是家庭作业,而是真实的预测分析用例...

2 个答案:

答案 0 :(得分:0)

也许......猜测data.clean.test是一个函数而不是数据对象:

any( sapply( L , data.clean.test, j)

或者如果猜测错误并且" j"在您的工作区中是常量,然后:

any( sapply( L, function(x) data.clean.test[ j, x] )

any函数将测试任何TRUE(或可强制转换为TRUE)值。这意味着要么" =="或any对于不等于0的数值或逻辑TRUE,将给出真值" -value为TRUE。

答案 1 :(得分:0)

假设您的数据看起来有点像

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为true的所有行。和

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)。