为什么此功能适用于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

想要在线上或在列上应用?

+0

嗨!我希望函数检查索引列上的每一行是否这些列中至少有一个(任何)值是= 1.所以我想这意味着按行 – deca

+0

应用好吧,那么你不能使用sapply,因为它适用于列(使用sapply时,您的data.frame被视为列列表。) –

+0

好的,所以在这种情况下,最好使用MARGIN = 1的apply? 另外,你能告诉我为什么直接调用函数也只给出1? (例如, 'dat $ sel.compbase deca