#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)
не создавать значения