Я хотел бы сравнить неупорядоченные наборы данных в нескольких строках, идентифицируя несоответствующие данные из каждой строки в новые столбцы. Например, мои данные структурированы как
org_id <- c("1234", "1234", "1234", "1234", "2345","2345", "2345")
original_value <- c("food", "dental care", "diapers", " ", "care", "housing", "utilities")
new_value <- c("dental care", "emergency food", "diapers", "dental care", "housing", "utilities", "care")
date_change <- c("2018-01-31", "2018-01-31", "2018-01-31", "2018-01-31","2018-01-31", "2018-01-31", "2018-01-31")
df <- data.frame(org_id, original_value,new_value, date_change)
где каждая строка представляет собой изменение в услугах организации, а «date_change» относится к дате, когда произошло изменение. Вы заметите, что когда вы смотрите на изменения, связанные с первой организацией, некоторые из них просто представляют собой изменения в порядке перечисленных услуг, а не изменения в услугах (например, «стоматологическая помощь» для организации «1234»). Я хотел бы получить вывод, который идентифицирует фактические удаленные значения и фактические добавленные значения в новых столбцах, как в примере ниже:
org_id2 <- c("1234", "1234")
removed_value <- c("food", " ")
added_value <- c("emergency food","housing")
date_change2 <- c("2018-01-31","2018-01-31")
df2 <- data.frame(org_id2, removed_value, added_value, date_change2)
Любые мысли о том, как подойти к этой проблеме? Спасибо!





Возможно что-то вроде этого:
df %>%
pivot_longer(2:3) %>%
group_by(org_id,date_change,value) %>%
filter(n()==1 & trimws(value)! = "") %>%
pivot_wider(id_cols = org_id:date_change,names_from = name, values_from = value)
Выход:
org_id date_change original_value new_value
<chr> <chr> <chr> <chr>
1 1234 2018-01-31 food emergency food
Если вы хотите в длинном формате и хотите сохранить пустую строку и т. д., вы можете сделать это:
df %>%
pivot_longer(2:3,names_to = "action") %>%
group_by(org_id,date_change,value) %>%
filter(n()==1) %>%
mutate(action=if_else(action= = "original_value", "removed", "added"))
Выход:
org_id date_change action value
<chr> <chr> <chr> <chr>
1 1234 2018-01-31 removed "food"
2 1234 2018-01-31 added "emergency food"
3 1234 2018-01-31 removed " "
Я использовал вариант длинного формата, и он отлично работал с моими реальными данными. Большое спасибо
корпус стоит под 2345, почему он у вас в первом стоит 1234???