【发布时间】:2017-09-11 15:52:54
【问题描述】:
我有一组属于不同股票指数的公司。我想根据索引的名称创建不同的子集。
这是一个可重现的例子:
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 在这种情况下无法简化输出的原因。
【问题讨论】: