Объединение данных в R по первой строке, затем по второй и т. Д. - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть два набора данных с одной общей переменной - идентификатором (в обоих наборах данных есть повторяющиеся идентификационные номера).Мне нужно связать даты с одним набором данных, но я не могу использовать левое соединение, потому что первый или левый файл, так сказать, должен оставаться как есть (я не хочу, чтобы он возвращал все комбинации и добавлял строки).Но я также не хочу, чтобы он связывал данные, такие как vlookup, в Excel, который находит первое совпадение и возвращает его, поэтому, когда у меня есть дубликаты идентификационных номеров, он возвращает только первое совпадение.Мне нужно, чтобы он возвратил первое совпадение, затем второе, затем третье (потому что даты отсортированы так, чтобы самые новые даты всегда были первыми для каждого идентификационного номера), и так далее, НО я не мог добавить строки.Есть какой-либо способ сделать это?Поскольку я не знаю, как еще показать вам, я включил пример изображения того, что мне нужно. объединение данных .Не уверен, что я ясно дал понять, но спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вам нужен дополнительный идентификатор столбца.Поскольку вам нужны первые n совпадений, просто сгруппируйте их по идентификатору, создайте идентификатор автоинкремента для каждой группы, а затем присоединитесь как обычно

df1<-data.frame(id=c(1,1,2,3,4,4,4))
d1=sample(seq(as.Date('1999/01/01'), as.Date('2012/01/01'), by="day"),11)
df2<-data.frame(id=c(1,1,1,1,2,3,3,4,4,4,4),d1,d2=d1+sample.int(50,11))
library(dplyr)
df11 <- df1 %>%
  group_by(id) %>%
  mutate(id2=1:n())%>%
  ungroup()
df21 <- df2 %>%
  group_by(id) %>%
  mutate(id2=1:n())%>%
  ungroup()

left_join(df11,df21,by = c("id", "id2"))

# A tibble: 7 x 4
     id   id2 d1         d2        
  <dbl> <int> <date>     <date>    
1     1     1 2009-06-10 2009-06-13
2     1     2 2004-05-28 2004-07-11
3     2     1 2001-08-13 2001-09-06
4     3     1 2005-12-30 2006-01-19
5     4     1 2000-08-06 2000-08-17
6     4     2 2010-09-02 2010-09-10
7     4     3 2007-07-27 2007-09-05
0 голосов
/ 17 сентября 2018

Вы можете добавить второй столбец для создания subid, которые следуют за порядком чисел.Затем вы можете использовать inner_join, чтобы объединить все вместе.

Поскольку у вас нет примеров наборов данных, я создал два, чтобы показать принцип.

df1 <- df1 %>% 
  group_by(ID) %>% 
  mutate(follow_id = row_number())


df2 <- df2 %>% group_by(ID) %>% 
  mutate(follow_id = row_number())

outcome <- df1 %>% inner_join(df2)

# A tibble: 7 x 3
# Groups:   ID [?]
     ID sub_id var1 
  <dbl>  <int> <fct>
1     1      1 a    
2     1      2 b    
3     2      1 e    
4     3      1 f    
5     4      1 h    
6     4      2 i    
7     4      3 j    

data:

df1 <- data.frame(ID = c(1, 1, 2,3,4,4,4))
df2 <- data.frame(ID = c(1,1,1,1,2,3,3,4,4,4,4),
                  var1 = letters[1:11])
...