2014-09-03 1 views
0

transform 내에 사용하려고합니다.lapply, cbind, 변환 내에서 적용

그래서이 예상대로 작동합니다

dfX1 = data.frame(a = rpois(100, 10), 
      b = rpois(100, 10)) 
dfX2 = transform(dfX1, c = a %in% c(6, 7)) 

을하지만, 내가 좋아하는 뭔가를하려고하면

dfX3 = transform(dfX1, 
       c = apply(
        do.call('cbind', 
          lapply(c(a, b), 
            function(x) x %in% c(6, 7))), 1, sum)) 

내가 이상한 결과를 얻을 :

> head(dfX3) 
    a b c 
1 9 9 26 
2 9 8 26 
3 6 7 26 
4 9 11 26 
5 11 9 26 
6 11 16 26 

내 기대는 것입니다을 lapply은 행렬로 강제 변환 될 벡터 목록을로 반환합니다.및 apply은 행에 걸쳐 sum 함수를 적용합니다.

제가 누락 된 항목이 확실하지 않습니다.

+2

인'C (A, B)'리스트'에 의해 (A, B)'문제를 해결할 것입니다. –

+0

@VincentGuillemot 그렇습니다! 하지만 왜? – tchakravarty

+0

'c (a, b)'는'a'의 값을 포함하고'b'의 값을 포함하는 벡터이기 때문입니다. 원하는 것은'a'와'b'에 함수를 적용하는 것이므로 목록이 필요합니다. –

답변

3

이 경우 문제는 과 b 열의 연결 인 c(a, b)에서 발생합니다. 결과는 라인을 따라 반복되는 ab 모두에서 6 또는 7과 같은 값의 수입니다.

c (a, b)를 목록 (a, b)으로 대체하면 올바른 결과를 얻을 수 있습니다. 또한

, 더 합성 방법이나이 일을 내가 대신 생각

transform(dfX1, c= apply(data.frame(a,b), 1, function(u) sum(u %in% 6:7)))