使用dplyr重新编码列值

时间:2015-10-10 01:58:34

标签: r dplyr

我遇到麻烦(可能因为我是dplyr的新手)试图重新编码值。我试图按编号拆分参与者,然后将日期值重新编码为1,依此类推。目前它是一个月中的某一天......我的目标是让它成为实验的一天。注意:参与者列出的第一个日期应为第1天。

我的尝试:

df<-data.frame(participant_number=c(1,1,1,2,2),month=c(3,3,4,3,3),day=c(6,6,1,7,8))
res<-setDT(df) %>% group_by(participant_number) %>% day 

我的目标:

participant_number day   month  recoded_day
1                  6       3     1
1                  6       3     1
1                  1       4     2
2                  7       3     1
2                  8       3     2

2 个答案:

答案 0 :(得分:5)

我在您的代码中看到了setDT(),因此,如果您有兴趣,可以使用完整的 data.table 解决方案。

library(data.table)
setDT(df)[, 
    recoded_day := cumsum(c(1, diff(as.IDate(paste(month, day), "%m %d")))), 
    by = participant_number
]

给了我们

   participant_number month day recode_day
1:                  1     3   6          1
2:                  1     3   6          1
3:                  1     4   1         27
4:                  2     3   7          1
5:                  2     3   8          2

答案 1 :(得分:4)

你可以尝试:

library(dplyr)
df %>% group_by(participant_number) %>%
       mutate(recoded_day = day - day[1] + 1) 

Source: local data frame [5 x 3]
Groups: participant_number [2]

  participant_number   day recoded_day
               (dbl) (dbl)       (dbl)
1                  1     6           1
2                  1     6           1
3                  1     7           2
4                  2     7           1
5                  2     8           2

编辑:如果你有几个月和几天,首先要把它变成日期格式(注意你需要一年,特别是如果涉及闰年):

df$date <- as.Date(paste(df$month, df$day, "2015"), format = "%m %d %Y") 

然后在此新日期列中使用相同的代码:

df %>% group_by(participant_number) %>%
       mutate(recoded_day = as.numeric(date - date[1] + 1)) 

Source: local data frame [5 x 5]
Groups: participant_number [2]

  participant_number month   day       date recoded_day
               (dbl) (dbl) (dbl)     (date)       (dbl)
1                  1     3     6 2015-03-06           1
2                  1     3     6 2015-03-06           1
3                  1     4     1 2015-04-01          27
4                  2     3     7 2015-03-07           1
5                  2     3     8 2015-03-08           2