2017-09-11 4 views
1

다른 주식 지수에 속하는 일련의 회사가 있습니다. 색인의 이름을 기반으로 다른 하위 집합을 만들고 싶습니다. 지금은 다음과 같은 간단한 기능을 작성했습니다이 기능은 왜 적용이 가능하지만 사pply와 함께 작동하지 않습니까?

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) 

: 여기

는 재현 예입니다. 그것은

fun<- function(x) { 
    if (any(x == 1)) { 
    1 
    } else { 
    0 
    } 
} 

같음 1. 나는 다른 벡터 세트, 아래처럼이 기능을 적용 할 수 있습니다, 다른 행을 이동하고 인덱스 회원 스탠드 인형, 적어도 하나가 나타납니다 :

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를 사용할 수는 없습니다. columns (sapply를 사용하는 동안 data.frame은 열의 목록으로 보여진다.) –

+0

이 경우, MARGIN = 1에서 apply를 사용하는 것이 가장 좋은가? 또한 왜 함수를 직접 호출해도 1을 만듭니 까? (예 : 'dat $ sel.compbase <-fun (x = dat [grepl ("^ cs.ind.", names (dat))])' – deca