为什么这个功能适用于适用但不适用于sapply?

时间:2017-09-11 15:52:55

标签: r apply 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在这种情况下无法简化输出的原因。

1 个答案:

答案 0 :(得分:1)

sapply函数在列上应用您的FUN。要在列上apply,您需要设置MARGIN = 2

Doyou想在线上还是在栏目上申请?