2017-01-04 44 views
1

我的数据集的样子:如何根据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 112264 12-23 6 
1002 112264 12-23 7 
1002 112264 12-23 8 

我想要的结果如下图所示;它为每个唯一的VISIT_ID分配一个增量遇到值。序列将从每个ID的1开始重新开始。帮助将不胜感激。

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 
+1

另请参阅http://stackoverflow.com/questions/37006427/group-values-by-unique-elements/37007036#37007036为了更好地理解下面提出的解决方案+一些其他选项的优点/缺点。 –

回答

1

我们可以使用match通过 '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 

或者另一种选择分组后,找到独特的 'VISIT_ID' 索引duplicated

df1 %>% 
    group_by(ID) %>% 
    mutate(ENCOUNTER = cumsum(!duplicated(VISIT_ID))) 

或使用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)))) 
+2

'ave(df $ VISIT_ID,df $ ID,FUN =函数(x)匹配(x,unique(x)))' –

1

随着base Rave我们可以转换到VISIT_IDfactor然后numeric获得唯一编号,每VISIT_IDID

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 
+0

我会说这是因为你转换为'numeric'的方式有问题 – akrun

+0

不确定你这意味着。在哪种情况下会失败? –

+0

假设你有像as.numeric(factor(c(“B”,“B”,“A”,“A”)))'(尽管在这个例子中显示,它可以工作)元素 – akrun

相关问题