我试图让这个数据变宽而不是长。我没有重铸(基于日期似乎变得棘手),而是尝试了另一种方法。对于每个独特的候选人,我想填充名为" Felony1" " Felony1Date"," Misdemeanor1"和" Misdemeanor1Date" (可能会增加更多的重罪和轻罪,但现在这无关紧要。)(同样数字大于1我们可以视为1.)
CandidateID Conviction.Date Felony Misdemeanor
1 1234 2007-09-27 0 3
2 1234 2009-02-09 0 2
3 1234 2013-01-16 10 0
4 1234 1993-03-15 1 0
5 5678 2006-04-27 1 0
6 5678 2011-01-11 0 1
我正在寻找一种方法来检查候选人是否有值>在Misdemeanor / Felony专栏中为0,如果是,请创建一个新专栏" Felony1" /" Misdemeanor1"这需要1.另外," Felony1Date" /" Misdemeanor1Date"应该从相应的行中取日期。我想在每个候选人的第一行发生这一切,如下所示。
CandidateID Fel1 Fel1Date Misd1 Misd1Date Misd2 Misd2Date
1 1234 1 2013-01-16 1 2007-09-27 1 2009-02-09
2 5678 1 2006-04-27 1 2011-01-11 0 NA
我尝试过使用mutate和data.table包。但是,我无法将新列的值放在正确的行中。
df <- group_by(CandidateID) %>% mutate(Felony1 = ifelse(Felony > 0, 1, 0))
df[, F := 1[Felony > 0], by=CandidateID]
根据Akrun的建议编辑
答案 0 :(得分:0)
试试这个:
library(dplyr)
df <- df %>% arrange(CandidateID, Conviction.Date) %>% group_by(CandidateID) %>% slice(1) %>% mutate(Felony1 = ifelse(Felony > 0, 1, 0), Felony1Date = Conviction.Date, Misdemeanor1 = ifelse(Misdemeanor > 0, 1, 0), Misdemeanor1Date = Conviction.Date)