Поиск уникальных идентификаторов на основе совпадающих дат, данных.таблица r

#r #data.table

Вопрос:

У меня есть некоторые данные, вот так

 library(data.table)  data1 lt;- data.table(  id = c(seq(1:5)),  date = c(as.Date("2021-05-05"),as.Date("2021-05-04"),as.Date("2021-05-03"),as.Date("2021-05-02"),as.Date("2021-05-01")),  var = c(rep("var1",5)) )  data2 lt;- data.table(  id = c(seq(1:5)),  date = c(as.Date("2021-05-05"),as.Date("2020-05-04"),as.Date("2020-05-03"),as.Date("2020-05-02"),as.Date("2020-05-01")),  var = c(rep("var2",5)) )  data3 lt;- data.table(  id = c(seq(1:5)),  date = c(as.Date("2021-05-05"),as.Date("2020-07-04"),as.Date("2020-07-03"),as.Date("2020-07-02"),as.Date("2020-07-01")),  var = c(rep("var3",5)) )  data4 lt;- data.table(  id = c(seq(1:5)),  date = c(as.Date("2021-05-05"),as.Date("2020-07-04"),as.Date("2020-07-03"),as.Date("2020-07-02"),as.Date("2020-07-01")),  var = c(rep("var4",5)) )  data lt;- rbind(data1,data2,data3,data4) data lt;- data[order(id)]  

Я хотел бы найти и сохранить эти уникальные идентификаторы (включая сохранение дат), где даты для var1, var2 и var3 равны друг другу. Меня не волнует var4. В приведенных выше данных только идентификатор 1 соответствовал бы этим критериям, поэтому я хочу получить что-то вроде этого:

 data_final lt;- data.table(  id = 1,  date_var1 = as.Date("2021-05-05"),  date_var2 = as.Date("2021-05-05"),  date_var3 = as.Date("2021-05-05") )  

Ответ №1:

Используйте dcast для преобразования в широкий формат после фильтрации — сгруппируйте по «идентификатору», отфильтруйте «идентификатор», все значения в «дате» одинаковы. Затем выполните dcast обработку отфильтрованных данных, чтобы преобразовать их обратно в широкий формат

 data1 lt;- data[data[, .I[uniqueN(date[var %in% paste0("var", 1:3)]) == 1],id]$V1  ][var != 'var4'] out1 lt;- dcast(data1, id ~ paste0('date_', var), value.var = 'date')  

-выход

 gt; out1  id date_var1 date_var2 date_var3 1: 1 2021-05-05 2021-05-05 2021-05-05  

Комментарии:

1. Я не уверен, что это сработает. Я должен был уточнить. Фактический набор данных составляет ок. 15 миллионов строк, поэтому я предполагаю, что изменение данных не сработает?

2. Эта часть: [var %в% paste0(«var», 1:3)], я бы не знал, что это обязательно первые 3 строки?

3. @epiNS в вашем посте говорится, что вас интересуют только var1, var2, var3, т. е. where date for var1, var2, and var3 is equal to one another. I dont care about var4. . Я мог бы явно показать c("var1", "var2", "var3") , а paste0("var", 1:3) не создавать значения