2017-09-11 153 views
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

sapply函數將你的FUN應用於列。到apply列上,你需要設置MARGIN = 2

想要在線上或在列上應用?

+0

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

+0

應用好吧,那麼你不能使用sapply,因爲它適用於列(使用sapply時,您的data.frame被視爲列列表。) –

+0

好的,所以在這種情況下,最好使用MARGIN = 1的apply? 另外,你能告訴我爲什麼直接調用函數也只給出1? (例如, 'dat $ sel.compbase <-fun(x = dat [grepl(「^ cs.ind。」,names(dat))])' – deca

相關問題