Извлечение дат, которые существуют в другом фрейме данных в каждом предмете (R) - PullRequest
1 голос
/ 26 марта 2019

У меня есть 2 фрейма данных, оба с разными датами:

Фрейм данных 1

ID    Date
A    21/1/2018
A    22/1/2018
B    21/1/2018
B    26/2/2018
C    19/9/2019

Фрейм данных 2

ID    Date
A    21/1/2018
A    22/1/2018
A    23/1/2018
B    21/1/2018
B    22/1/2018
B    23/1/2018
C    20/1/2018
C    04/5/2018

Я хочу извлечь только даты из Фрейма данных2, которые присутствуют у каждого участника в Dataframe 1:

 ID    Date
A    21/1/2018
A    22/1/2018
B    21/1/2018

или некоторый индекс строки:

[1 2 4]   

Я, вероятно, могу сделать это с помощью вложенных циклов, но мои данные содержат десяткитысячи случаев, так что мне интересно, есть ли в R более эффективный вычислительный метод для этого?Спасибо!

Ответы [ 4 ]

2 голосов
/ 26 марта 2019

Если у вас есть два вектора дат:

 dates1 <- seq(as.Date('1999/01/01'), as.Date('1999/01/10'), by="day")

 dates2 <- seq(as.Date('1999/01/08'), as.Date('1999/01/15'), by="day")

, вы можете найти индексы нужных вам дат с помощью

which(dates2 %in% dates1)
1 голос
/ 26 марта 2019

Если я правильно понял ваш вопрос, похоже, merge(df2, df1) должно просто сработать.

merge(df2, df1)
  ID      Date
1  A 21/1/2018
2  A 22/1/2018
3  B 21/1/2018
0 голосов
/ 26 марта 2019

Если я вас правильно понял, вы хотите узнать dates, которые присутствуют в одном и том же ID из обоих кадров данных.Мы можем split оба кадра данных на основе ID и найти Date в df2, которые присутствуют в df1, и извлечь эти строки.

do.call(rbind, Map(function(x, y) x[x$Date %in% y$Date, ], 
              split(df2, df2$ID), split(df1, df1$ID)))

#  ID      Date
#A.1  A 21/1/2018
#A.2  A 22/1/2018
#B    B 21/1/2018

Вы также можете получить индекс строки, выполнив

df2$row <- 1:nrow(df2)
unname(unlist(Map(function(x, y) x$row[x$Date %in% y$Date], 
              split(df2, df2$ID), split(df1, df1$ID))))
#[1] 1 2 4
0 голосов
/ 26 марта 2019

Вы можете фильтровать, как показано ниже:

df2[df2$Date %in% df1$Date, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...