R эквивалентно SAS "объединить" "по" - PullRequest
0 голосов
/ 22 мая 2019

Если вы используете «слияние» и «по» в SAS для объединения наборов данных, которые содержат несколько переменных с одинаковыми именами (кроме идентификаторов, с которыми вы объединяетесь), SAS объединит эти переменные в одну, используя значение прочитайте последний - это описано здесь https://communities.sas.com/t5/SAS-Programming/Merge-step-overwriting-shared-vars/m-p/281542#M57117

Текст сверху ссылка:

"Существует правило: какое бы значение не было прочитано последним. Но это правило простое, только когда слияние выполняется один к одному. В этом случае получаемое значение зависит от порядка в выражении MERGE. :

объединить a b;

по id;

Значение общих переменных (для слияния один-к-одному) берется из набора данных B. SAS считывает значение из набора данных A, а затем считывает значение из набора данных B. Значение из B равно прочитайте в последнюю очередь и перезапишите значение, прочитанное из набора данных A.

Если имеется несоответствие и идентификатор появляется только в наборе данных A, но не в наборе данных B, это будет значение, найденное в наборе данных A. "

Как заставить R вести себя так же, не комбинируя строки после определенных условий? (в SAS значения не перезаписываются NA)

library(tidyverse)
#create tibbles
df1 <- tibble(id = c(1:3), y = c("tt", "ff", "kk"))
df2 <- tibble(id = c(1,2,4), y = c(4,3,8))
df3 <- tibble(id = c(1:3), y = c(5,7,NA)) 
#combine the tibbles
combined_df <- list(df1, df2, df3) %>% 
reduce(full_join, by = "id")
# desired output
combined_df_desired <- tibble(id = 1:4, y = c(5,7,"kk",8))

1 Ответ

0 голосов
/ 22 мая 2019

Я не знаю точно, что вы имеете в виду под "определенными условиями". Нет способа изменить внутреннюю работу full_join(), но вы можете сделать:

list(df1, df2, df3) %>% 
  reduce(full_join, by = "id") %>%
  mutate_all(as.character) %>%
  mutate(y = coalesce(y, y.y , y.x,)) %>%
  select(id, y)

 A tibble: 4 x 2
  id    y    
  <chr> <chr>
1 1     5    
2 2     7    
3 3     kk   
4 4     8   

coalesce() принимает набор столбцов и возвращает первое не-NA значение для каждой строки. Вы можете заказать столбцы внутри функции в соответствии с вашими приоритетами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...