R : data.frame의 모든 행에 대해 다른 여러 조건에서 새 열을 계산하는 방법에 대한 권장 사항

대뇌 뇌 손상

행의 모든 ​​항목에 대해 60 개 이상의 다른 열에 대한 조건에 따라 data.frame의 새 열로 두 개의 변수를 계산해야합니다. 우아함을 실현하는 방법에 대한 귀하의 추천을 받고 싶습니다 (while and for, with, ifelse, foreach, by 또는 ddply?). 예제 코드의 첫 번째 경우처럼 수동으로 수행하는 것을 좋아하지 않으며 성능에 관심이 없습니다.

더 나아가 : 아마도 transform (ddply 또는 by)과 같은 함수를 사용하는 방법과 그 기능을 이해했는지 물어볼 필요가 없습니다. 따라서 나는 당신이 그것에 관한 좋은 튜토리얼을 추천 할 수 있기를 바랍니다. 나는 많은 것을 발견했지만 다른 맥락에서 그것을 이해하거나 내 사건을 위해 필사 할 수 없었다.

제 경우 : 해당 이벤트의 종류와 날짜를 나타내는 20 개의 이벤트 각각에 대해 세 개의 열이 있습니다. 각 행에 대해 하나의 특수 이벤트 (특별한 종류가 다른 이벤트 전후에 발생했는지 여부에 따라 다름)와 행의 모든 ​​항목에 대해 고정 된 날짜 간의 시간 차이를 계산 (및 해당 data.frame에 저장)해야합니다. 또한 해당 이벤트의 날짜를 저장해야합니다.

이것은 내가 한 방법입니다 (작동하지만 첫 번째 경우에만 실행됩니다).

#event.2 (1. event month), event.3 (1. event year), event.4 (1. event kind), event.5 (2. event month), event.6 (2. event year), ...

df$dit[(!is.na(df$event.2) & !is.na(df$event.3) & !is.na(df$event.4) & !is.na(df$event.5) & !is.na(df$event.6) & !is.na(df$event.7)) 
             & ( 
               (df$event.4 == 3 & ((1/12*df$event.2)+df$event.3) > df$fixdate) & (df$event.7 == 1 | df$event.7 == 2)
               )] = ((1/12*df$event.2)+df$event.3) - df$fixdate
df$date[(!is.na(df$event.2) & !is.na(df$event.3) & !is.na(df$event.4) & !is.na(df$event.5) & !is.na(df$event.6) & !is.na(df$event.7)) 
             & ( 
               (df$event.4 == 3 & ((1/12*df$event.2)+df$event.3) > df$fixdate) & (df$event.7 == 1 | df$event.7 == 2)
             )] = ((1/12*df$event.2)+df$event.3)

df$dit[(!is.na(df$event.2) & !is.na(df$event.3) & !is.na(df$event.4) & !is.na(df$event.5) & !is.na(df$event.6) & !is.na(df$event.7))
             & ( 
                 (df$event.4 == 1 & ((1/12*df$event.2)+df$event.3) > df$fixdate)
               | (df$event.4 == 2 & ((1/12*df$event.2)+df$event.3) > df$fixdate)
               )] = 0
df$date[(!is.na(df$event.2) & !is.na(df$event.3) & !is.na(df$event.4) & !is.na(df$event.5) & !is.na(df$event.6) & !is.na(df$event.7))
             & ( 
               (df$event.4 == 1 & ((1/12*df$event.2)+df$event.3) > df$fixdate)
               | (df$event.4 == 2 & ((1/12*df$event.2)+df$event.3) > df$fixdate)
             )] = df$fixdate

df$dit[(!is.na(df$event.2) & !is.na(df$event.3) & !is.na(df$event.4) & !is.na(df$event.5) & !is.na(df$event.6) & !is.na(df$event.7)) 
             & ( 
                (
                    (df$event.4 == 1 & ((1/12*df$event.2)+df$event.3) < df$fixdate)
                  & (  
                      (df$event.7 == 1 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                    | (df$event.7 == 2 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                    )
                )
               | 
                (
                     (df$event.4 == 2 & ((1/12*df$event.2)+df$event.3) < df$fixdate)
                   & (  
                       (df$event.7 == 1 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                     | (df$event.7 == 2 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                     )
                )
              )] = ((1/12*df$event.5)+df$event.6) - df$fixdate
df$date[(!is.na(df$event.2) & !is.na(df$event.3) & !is.na(df$event.4) & !is.na(df$event.5) & !is.na(df$event.6) & !is.na(df$event.7)) 
             & ( 
               (
                 (df$event.4 == 1 & ((1/12*df$event.2)+df$event.3) < df$fixdate)
                 & (  
                   (df$event.7 == 1 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                   | (df$event.7 == 2 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                 )
               )
               | 
                 (
                   (df$event.4 == 2 & ((1/12*df$event.2)+df$event.3) < df$fixdate)
                   & (  
                     (df$event.7 == 1 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                     | (df$event.7 == 2 & ((1/12*df$event.5)+df$event.6) > df$fixdate)
                   )
                 )
             )] = ((1/12*df$event.5)+df$event.6)
agstudy

조건을 표현식으로 정의하고 내에서 사용할 수 있습니다 transform. 아이디어는 가능한 한 귀하의 조건을 인수 분해하는 것입니다.

COND1 <- expression(!is.na(event.2) & !is.na(event.3) & 
                    !is.na(event.4) & !is.na(event.5) & 
                     !is.na(event.6) & !is.na(event.7))
COND2 <- expression(event.4 == 3 & ((1/12*event.2)+event.3) > fixdate) & 
                                    (event.7 == 1 | event.7 == 2))
COND3 <- expression(event.4 == 1 & ((1/12*event.2)+event.3) > fixdate)
COND4 <- expression(event.4 == 2 & ((1/12*event.2)+event.3) > fixdate)
### you continue here with the rest of conditions....

그런 다음 내부에서 사용하면 다음 transform과 같이 할 수 있습니다.

transform(df, date = ifelse(eval(COND1) & eval(COND2),((1/12*event.2)+event.3),NA),
transform(df, date = ifelse(eval(COND1) & (eval(COND3)|eval(COND4)),fixdate,NA))
## Note also that the seond "dit" variable is deduced from "date"
transform(df,dit=date-fixdate)  

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관