我遇到麻烦(可能因为我是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
答案 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