为什么此功能适用于sapply而不适用?
问题描述:
我有一套属于不同股票指数的公司。我想根据索引的名称创建不同的子集。为什么此功能适用于sapply而不适用?
这里是一个重复的例子:
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
在这种情况下不能简化输出。
答
sapply
函数将你的FUN应用于列。到apply
列上,你需要设置MARGIN = 2
想要在线上或在列上应用?
嗨!我希望函数检查索引列上的每一行是否这些列中至少有一个(任何)值是= 1.所以我想这意味着按行 – deca
应用好吧,那么你不能使用sapply,因为它适用于列(使用sapply时,您的data.frame被视为列列表。) –
好的,所以在这种情况下,最好使用MARGIN = 1的apply? 另外,你能告诉我为什么直接调用函数也只给出1? (例如, 'dat $ sel.compbase deca