如何为列中的重复名称设置唯一ID

时间:2017-09-28 07:25:24

标签: r

我的数据包括患者随时间变化的样本。该数据超过10197次观测。我的数据的一个(小)示例是:

PatientName <- c("Jones", "Jones", "Jones", "Smith", "Smith", "Nixon", "Nixon", "Nixon")
SampleType <- c("Venous", "Arterial", "Capillary", "Venous", "Venous", "Venous", "Venous", "Capillary")
DayTested <- c("Monday", "Tuesday", "Wednesday", "Monday", "Monday", "Monday", "Monday", "Tuesday")

df <- data.frame(PatientName, SampleType, DayTested)

我现在希望在同一天患有同一患者的重复样本类型时包含一个唯一的ID。

我的预期输出是:

df$ID <- c(1,1,1,1,2,1,2,1)

这会重复出现"Smith""Nixon"重复出现的"Venous"个样本,这些样本是在ID = 2指定的"Monday"上进行的。所有其他ID&#39; s将等于1,因为它们是单独的样本,在单独的日子拍摄。

这可以在R吗?

3 个答案:

答案 0 :(得分:4)

我们可以使用ave

df$ID <- with(df, as.integer(ave(as.character(SampleType),
         PatientName, DayTested, FUN = seq_along)))
df$ID
#[1] 1 1 1 1 2 1 2 1

或@lmo建议

df$ID <- with(df, ave(as.integer(SampleType), PatientName, DayTested, FUN = seq_along))

答案 1 :(得分:2)

不是100%你想要的,但这会得到理想的结果。

df$ID <- duplicated(df) + 1

答案 2 :(得分:2)

阿克伦的答案是完美的。只是为了展示dplyrcumsum函数

的不同方式
df %>% mutate(id = 1) %>% group_by(PatientName, SampleType, DayTested) %>% 
  mutate(id = cumsum(id)) %>% ungroup()