1
我有一套屬於不同股票指數的公司。我想根據索引的名稱創建不同的子集。爲什麼此功能適用於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.所以我想這意味着按行 – deca
應用好吧,那麼你不能使用sapply,因爲它適用於列(使用sapply時,您的data.frame被視爲列列表。) –
好的,所以在這種情況下,最好使用MARGIN = 1的apply? 另外,你能告訴我爲什麼直接調用函數也只給出1? (例如, 'dat $ sel.compbase <-fun(x = dat [grepl(「^ cs.ind。」,names(dat))])' – deca