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인지 여부에 관계없이 인덱스 된 열의 각 행을 검사하는 함수가 필요합니다. 따라서 행 단위로 적용하는 것이 좋습니다. – deca
그렇기 때문에 sapply를 사용할 수는 없습니다. columns (sapply를 사용하는 동안 data.frame은 열의 목록으로 보여진다.) –
이 경우, MARGIN = 1에서 apply를 사용하는 것이 가장 좋은가? 또한 왜 함수를 직접 호출해도 1을 만듭니 까? (예 : 'dat $ sel.compbase <-fun (x = dat [grepl ("^ cs.ind.", names (dat))])' – deca