2014-12-29 3 views
4

data.frame 열의 함수에서 여러 결과를 반환하고이 새로운 열을 다른 간단한 계산과 함께 data.frame에 추가하려고합니다. 간단한 예를 들어하나의 함수에서 여러 열을 계산하여 data.frame에 추가하십시오.

, 내가 통합 간격의 중간 점과 함께 sin 기능의 적분 값과 절대 오류를 모두 얻으려면 : 이름을 구분하기 때문에

df <- data.frame(Lower = c(1,2,3), Upper = c(2,3,4)) 
setDT(df) 
getIntegral <- function(l, u) { 
    n <- integrate(sin, mean(l), mean(u)) 
    list(Value=n$value, Error=n$abs.error) 
} 
df[, 
    c('Value', 'Error', 'Mid') := { 
    n <- getIntegral(Lower, Upper) 
    list(n$Value, 
      n$Error, 
      (Lower+Upper)/2) 
    }] 
df 
    Lower Upper  Value  Error Mid 
1:  1  2 0.5738457 6.370967e-15 1.5 
2:  2  3 0.5738457 6.370967e-15 2.5 
3:  3  4 0.5738457 6.370967e-15 3.5 

나는 확실히 내 접근 좋아해요 새로운 열과 그 열에 할당 된 값으로 인해 열심히 읽게됩니다.이 작업을 어떻게 더 잘 수행 할 수 있습니까? 긴 데이터 처리 체인의 일부로 외부에 임시 변수를 만들지 않으므로 data.table 또는 dplyr만을 사용하는 솔루션을 선호합니다.

+0

data.table 구문이 마음에 들지 않습니까? – jlhoward

+0

이런 뜻인가요 ?? 오류 = getIntegral (Lower, Upper) $ Error, Mid = (Lower + Upper)/2)] – jlhoward

+0

또는 setIntegral ($$$$, 아마 이것 ?? '(값, 오류, (아래 + 위쪽)/2))]] – jlhoward

답변

5

RHS는 값 목록이어야하며 목록의 각 요소는 열로 변환되어 필요에 따라 재활용됩니다.

함수가 이미 list (각각 길이 1)을 반환하고 (Lower+Upper)/2은 3 개의 값 (여기)의 벡터를 반환합니다. 다음과 같은 목록을 반환하려면 함수 c()를 사용할 수 있습니다

df[, c('Value', 'Error', 'Mid') := c(getIntegral(Lower, Upper), list((Lower+Upper)/2))] 
# Lower Upper  Value  Error Mid 
# 1:  1  2 0.5738457 6.370967e-15 1.5 
# 2:  2  3 0.5738457 6.370967e-15 2.5 
# 3:  3  4 0.5738457 6.370967e-15 3.5 

이 사실의 사용을 만드는 연접 목록에서 c(list, list) 결과.

+0

@jlhoward가 질문에 주석을 달아서, setDT (df) [, ": ="(값 = getIntegral (하한값, 상한값) $ 값, Error = getIntegral (하한값, 상한값) $ Error, Mid = (Lower + Upper)/2)]', getIntegral을 두 번 실행하지 않고? 나는 긴 계산 목록을 가지고 있기 때문에 칼럼의 이름과 그에 할당 된 값을 더 가깝게하고 싶습니다. – user3684014

+0

아니, 나는 그것이 가능하다고 생각하지 않는다. – Arun

관련 문제