按组,根据组中的任何行是否具有特定值来更改列值

时间:2016-01-03 10:03:36

标签: r

我试图让这个数据变宽而不是长。我没有重铸(基于日期似乎变得棘手),而是尝试了另一种方法。对于每个独特的候选人,我想填充名为" 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的建议编辑

1 个答案:

答案 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)