2017-01-04 4 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. Последовательность будет перезапущена с 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, чтобы найти индекс уникальный 'VISIT_ID' после того, как группировка по '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 

Или другой вариант является 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 = function (x) match (x, unique (x)))' –

1

С base Rave мы можем преобразовать VISIT_ID в factor, а затем numeric получить уникальный номер для каждого VISIT_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 
+0

Я бы назвал это проблематичным, так как вы преобразовали в 'numeric' – akrun

+0

не уверены, что вы это значит. В таком случае это провалится? –

+0

Предположим, что у вас есть такие элементы, как 'as.numeric (factor (c (« B »,« B »,« A »,« A »)))' (хотя в показанном примере он может работать) – akrun

Смежные вопросы