如何基于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$conferenceave(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