我有一组属于不同股票指数的公司。我想根据索引的名称创建不同的子集。
这是一个可重复的例子:
cs.ind.sp500 <- c(1,1,1,0,0,0,0,0,0,0)
cs.ind.spsc1500 <- c(0,0,1,0,0,0,0,0,0,0)
cs.ind.dax40 <- c(0,0,0,0,0,0,0,1,1,1)
dat <- data.frame(cs.ind.sp500, cs.ind.spsc1500, cs.ind.dax40)
我现在写了以下简单的功能。它应该遍历不同的行,看看是否至少有一个代表索引成员资格的虚拟对象等于1.
fun<- function(x) {
if (any(x == 1)) {
1
} else {
0
}
}
我想将此函数应用于不同的向量集,如下所示:
dat$sel.compall <- sapply(X = dat[grepl("^cs.ind.", names(dat))], FUN = fun)
dat$sel.compbase <- sapply(X = dat[grepl("^cs.ind.", names(dat)) & !grepl("^cs.ind.spsc1500", names(dat))], FUN = fun)
但是,会发生以下情况:
第一个电话会抛出错误:
Error in `$<-.data.frame`(`*tmp*`, sel.compall, value = c(1, 1, 1)) :
replacement has 3 rows, data has 10
第二次调用为所有行分配1,即使条件不适用于所有行。
当我通过apply
申请时,例如......
dat$sel.compbase <- apply(X = dat[grepl("^cs.ind.", names(dat)) & !grepl("^cs.ind.spsc1500", names(dat))], FUN = fun, MARGIN = 1)
......似乎有效。
为什么我不能在这里使用sapply
?我没有看到sapply
在这种情况下无法简化输出的原因。
答案 0 :(得分:1)
sapply
函数在列上应用您的FUN。要在列上apply
,您需要设置MARGIN = 2
Doyou想在线上还是在栏目上申请?