R 如何为列中的循环名称设置唯一ID

R 如何为列中的循环名称设置唯一ID,r,R,我的数据包括随时间变化的患者样本,类型各不相同。该数据超过10197次观测。我的数据的一个(小)示例是: PatientName <- c("Jones", "Jones", "Jones", "Smith", "Smith", "Nixon", "Nixon", "Nixon") SampleType <- c("Venous", "Arterial", "Capillary", "Venous", "Venous", "Venous", "Venous", "Capillary"

我的数据包括随时间变化的患者样本,类型各不相同。该数据超过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)

PatientName我们可以使用
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

df$ID不是100%您想要的,但这会给出所需的结果

df$ID <- duplicated(df) + 1

df$IDakrun的答案非常完美。只是为了用
dplyr
cumsum
函数显示不同的方式

df %>% mutate(id = 1) %>% group_by(PatientName, SampleType, DayTested) %>% 
  mutate(id = cumsum(id)) %>% ungroup()

你能更详细地解释一下吗。如果在第7行之后有额外的一行,会发生什么呢?你可以用(df,ave(as.integer(SampleType),PatientName,DayTested,FUN=seq_-along))
@lmo谢谢,我之前已经考虑过了,
df$ID <- duplicated(df) + 1
df %>% mutate(id = 1) %>% group_by(PatientName, SampleType, DayTested) %>% 
  mutate(id = cumsum(id)) %>% ungroup()