首页 文章

R:关于如何为data.frame中的每一行计算其他条件的新列的建议

提问于
浏览
1

对于行中的每个条目,我需要计算两个变量作为data.frame中的新列,这取决于超过60个其他列 . 我希望你的建议如何实现优雅(同时,for,for,with,ifelse,foreach,by或ddply?) . 我不喜欢手动这样做,就像我在示例代码中的第一个案例那样,我不关心性能 .

进一步:可能我不需要问我是否理解如何使用变换(使用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)

1 回答

  • 1

    您可以将条件定义为表达式,并在 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)
    

相关问题