我有两个问题:
设计一个动态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
等等...
从未排序的小数列表中选择前N个结果(0到1之间的概率)
任何想法?这不是家庭作业,而是真实的预测分析用例...
答案 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)。