如何基于R中的两列分配增量值?

如何基于R中的两列分配增量值?,r,R,我的数据集如下所示: ID VISIT_ID DATE DV 1001 112233 12-23 3 1001 112233 12-23 4 1001 112244 12-23 5 1001 112244 12-23 6 1001 112244 12-23 7 1001 112244 12-23 8 1002 112254 12-23 3 1002 112254 12-23 4 1002 112254 12-23 5 1002 112

我的数据集如下所示:

ID   VISIT_ID  DATE  DV
1001 112233    12-23 3
1001 112233    12-23 4
1001 112244    12-23 5
1001 112244    12-23 6
1001 112244    12-23 7
1001 112244    12-23 8
1002 112254    12-23 3
1002 112254    12-23 4
1002 112254    12-23 5
1002 112264    12-23 6
1002 112264    12-23 7
1002 112264    12-23 8
我想要的结果如下;它为每个唯一的访问ID分配增量的遭遇值。序列将从1开始为每个ID重新启动。将非常感谢帮助

ID   VISIT_ID  DATE  DV  ENCOUNTER
1001 112233    12-23 3   1
1001 112233    12-23 4   1
1001 112244    12-23 5   2
1001 112244    12-23 6   2
1001 112244    12-23 7   2
1001 112244    12-23 8   2
1002 112254    12-23 3   1
1002 112254    12-23 4   1
1002 112254    12-23 5   1
1002 112264    12-23 6   2
1002 112264    12-23 7   2
1002 112264    12-23 8   2

我们可以使用
match
在按“ID”分组后找到唯一的“访问\u ID”索引

library(dplyr)
df1 %>% 
   group_by(ID) %>% 
   mutate(ENCOUNTER = match(VISIT_ID, unique(VISIT_ID))) 
#      ID VISIT_ID  DATE    DV ENCOUNTER
#    <int>    <int> <chr> <int>     <int>
#1   1001   112233 12-23     3         1
#2   1001   112233 12-23     4         1
#3   1001   112244 12-23     5         2
#4   1001   112244 12-23     6         2
#5   1001   112244 12-23     7         2
#6   1001   112244 12-23     8         2
#7   1002   112254 12-23     3         1
#8   1002   112254 12-23     4         1
#9   1002   112254 12-23     5         1
#10  1002   112264 12-23     6         2
#11  1002   112264 12-23     7         2
#12  1002   112264 12-23     8         2

或使用
data.table

library(data.table)
setDT(df1)[, ENCOUNTER := match(VISIT_ID, unique(VISIT_ID), by = ID]

或使用
base R

with(df1, ave(VISIT_ID, ID, FUN = function(x) cumsum(!duplicated(x))))

使用
base R
ave
我们可以将
访问ID
转换为
因子
,然后
数值
ID
的每个
访问ID
获得唯一的编号

df$ENCOUNTER <- ave(df$VISIT_ID, df$ID,FUN = function(x) as.numeric(as.factor(x)))
df

#     ID VISIT_ID  DATE DV ENCOUNTER
#1  1001   112233 12-23  3         1
#2  1001   112233 12-23  4         1
#3  1001   112244 12-23  5         2
#4  1001   112244 12-23  6         2
#5  1001   112244 12-23  7         2
#6  1001   112244 12-23  8         2
#7  1002   112254 12-23  3         1
#8  1002   112254 12-23  4         1
#9  1002   112254 12-23  5         1
#10 1002   112264 12-23  6         2
#11 1002   112264 12-23  7         2
#12 1002   112264 12-23  8         2

df$conference
ave(df$VISIT\u ID,df$ID,FUN=function(x)match(x,unique(x))
我认为这是一个问题,因为您转换为
数值的方式不确定这是什么意思。在哪种情况下它会失败?假设您有像.numeric(因子(c(“B”、“B”、“A”、“A”))
(尽管在所示的示例中,它可以工作)这样的元素是的。如果我们有
VISIT_ID
作为字符串,我们可以使用
match
cumsum
选项。是的,但这将近乎剽窃…:-)另请参见,以便更好地了解以下建议解决方案+一些其他选项的优缺点。
df$ENCOUNTER <- ave(df$VISIT_ID, df$ID,FUN = function(x) as.numeric(as.factor(x)))
df

#     ID VISIT_ID  DATE DV ENCOUNTER
#1  1001   112233 12-23  3         1
#2  1001   112233 12-23  4         1
#3  1001   112244 12-23  5         2
#4  1001   112244 12-23  6         2
#5  1001   112244 12-23  7         2
#6  1001   112244 12-23  8         2
#7  1002   112254 12-23  3         1
#8  1002   112254 12-23  4         1
#9  1002   112254 12-23  5         1
#10 1002   112264 12-23  6         2
#11 1002   112264 12-23  7         2
#12 1002   112264 12-23  8         2