按行,将第一个时间步移到第一个非零列(滞后),然后创建新变量

时间:2015-05-19 18:15:15

标签: r if-statement dataframe

我有一个示例data.frame(df,下面),其中包含三个时间步长sz_t1sz_t2sz_t3的变量值(大小)。变量t1_t2t2_t3t1_t3是个体(ID)'从时间步骤1 - 2,2 - 3或1中幸存下来的二元指示符 - 3.

我不想使用时间步,而是想用'年龄'作为时间单位。也就是说,使用每个ID的第一个非零值作为起始点。例如,如果sz_t1为零,t1_t2将被记录为NA,但如果sz_t1为零,则使用“年龄”,但sz_t2大于age1_2为了生存,可以用零或一个结果记录零而不是age。因此,如果我使用此sz_age1移位时间单位,我还想知道该年龄段的值(大小)(ifelse等)

下面的r代码使用df语句来实现示例data.frame(ifelse)的预期结果。然而,随着时间步长的增加,我觉得可能会有一个不那么冗长或“更清洁”的方法来实现我所寻求的结果。随着更多时间步骤的增加,我不确定我是否能够掌握ifelse链。

我试图根据第一个非零列索引查找创建组的信息,然后将这些组滞后于适当的值。但是,我没有办法做到这一点,至少不是宽格式,或者每组不同的滞后。

是否有另一个r包或命令能够实现这些结果以减少链接df <- structure(list(ID = 1:5, sz_t1 = c(0.5, 0.25, 0, 0, 0.25), sz_t2 = c(0.6, 0.25, 0.25, 0.55, 0), sz_t3 = c(0, 0.35, 0.35, 0, 0)), .Names = c("ID", "sz_t1", "sz_t2", "sz_t3"), class = "data.frame", row.names = c(NA, -5L)) # did the id 'survive' from t1 to t2, etc df$t1_t2 <- ifelse(df$sz_t1 > 0, ifelse(df$sz_t2 >0,1,0), NA) df$t2_t3 <- ifelse(df$sz_t2 > 0, ifelse(df$sz_t3 >0,1,0), NA) df$t1_t3 <- ifelse(df$sz_t1 > 0, ifelse(df$sz_t3 >0,1,0), NA) # "age" # did the id 'survive' from age1 to age2, etc df$age1_2 <- ifelse(df$sz_t1 > 0, ifelse(df$sz_t2 >0,1,0), ifelse(df$sz_t2 > 0, ifelse(df$sz_t3 >0,1,0), NA)) # if zero in first time step, age 2 to age 3 is NA as this time has yet to elapse df$age2_3 <-ifelse(df$age1_2 > 0, ifelse(df$sz_t1 > 0, ifelse(df$sz_t2 > 0, ifelse(df$sz_t3 > 0,1,0),NA),NA),NA) # for the moment this is the same as df$t1_t3, need a t1 to get a value for age1_3, otherwise NA as the this time period has yet to elapse df$age1_3 <- ifelse(df$sz_t1 > 0, ifelse(df$sz_t3 >0,1,0), NA) # what was the size at the ages df$sz_age1 <- ifelse(df$sz_t1 > 0, df$sz_t1, df$sz_t2) df$sz_age2 <- ifelse(df$sz_t1 > 0, df$sz_t2, df$sz_t3) df$sz_age3 <- ifelse(df$sz_t1 > 0, df$sz_t3, NA) 长度?

screen grab of data.frame and desired output

input.replace(/^.+?(?=\+)/, ''), "i")

1 个答案:

答案 0 :(得分:0)

好像你让它变得比它需要的复杂一点。 我不清楚sz列中的0值是否是z大小的动物(要小到可以测量),还是没有进行测量,因为没有观察到它们?

降低代码复杂性的一种方法可能是将NA替换为未进行测量的零,因为动物没有进入研究。

df$sz_T1[df$sz_T1 == 0]<-NA


df$t1_t2<-as.numeric(df$sz_T1 * df$sz_T2)>0)

您可以将两列相乘,并测试产品是否> 0。

这应该有助于生成捕获历史记录,并且可以根据您的df的入口部分进行生存,并通过相乘来添加您的尺寸测量值。