R: Объединить кадры данных по нескольким идентификаторам, выровнять по второму идентификатору, если они совпадают, в противном случае вставить NA - PullRequest
0 голосов
/ 03 октября 2019

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

df1
firm_id    user_id_source1
"1234"     "abc"
"1234"     "bcd"
"1234"     "cde"
"1234"     "def"
"1234"     "fgh"
"2345"     "zyx"
"2345"     "yxw"
"2345"     "xwv"
"2345"     "wvu"
"2345"     "vut"

И

df2
firm_id    user_id_source2
"1234"     "abc"
"1234"     "bcd"
"1234"     "ghi"
"1234"     "hij"
"2345"     "zyx"
"2345"     "yxw"
"2345"     "utr"

Есть много фирм, у каждой из которых есть много идентификаторов пользователей. Я ищу, чтобы объединить, где совпадают идентификатор пользователя, а затем остальные данные без потери каких-либо данных, потому что источник идентификатора пользователя важен. Вот так:

result
firm_id    user_id_source1    user_id_source2
"1234"     "abc"               "abc"
"1234"     "bcd"               "bcd"
"1234"     "cde"               NA
"1234"     "def"               NA
"1234"     "fgh"               NA
"1234"     NA                  "ghi"
"1234"     NA                  "hij"
"2345"     "zyx"               "zyx"
"2345"     "yxw"               "yxw"
"2345"     "xwv"               NA
"2345"     "wvu"               NA
"2345"     "vut"               NA
"2345"     NA                  "utr"

Я пробовал все типы объединения и слияния и не могу понять это. Любая помощь очень ценится. Спасибо.

РЕДАКТИРОВАТЬ: r-schifini ниже решил эту проблему. Спасибо. Я добавил

library(dplyr)
df <- df %>% arrange(firm_id, is.na(user_id_source1), is.na(user_id_source2))

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

РЕДАКТИРОВАТЬ2: Я уже использовал dplyr, так что это не проблема для меня, но я подумал, что кто-то в будущем может захотетьсохранить его в базе R. Вот как отсортировать это в базе R.


df_ordered <- df[order(df$firm_id, is.na(df$user_id_source1), is.na(df$user_id_source2)),]

1 Ответ

0 голосов
/ 03 октября 2019

Вам необходимо объединить кадры данных по двум столбцам: firm_id и user_id (1 и 2). Поскольку столбцы user_id имеют разные имена и вы хотите сохранить их, выполните:

df1 = data.frame(firm_id = c('1234','1234','5678','5678'),user_id_1 = c('abc','bcd','abc','xyz'))
df2 = data.frame(firm_id = c('1234','3456','5678'),user_id_2 = c('abc','bcd','xyz'))

# Create a copy of the user_id columns with a common name: 'user'
df1$user = df1$user_id_1
df2$user = df2$user_id_2

# do a full merge (they will be merged by 'firm_id' and 'user')
df = merge(df1, df2, all = T)

# remove the 'user' column
df$user = NULL

Результат:

> df1
  firm_id user_id_1 user
1    1234       abc  abc
2    1234       bcd  bcd
3    5678       abc  abc
4    5678       xyz  xyz

> df2
  firm_id user_id_2 user
1    1234       abc  abc
2    3456       bcd  bcd
3    5678       xyz  xyz

> df
  firm_id user_id_1 user_id_2
1    1234       abc       abc
2    1234       bcd      <NA>
3    5678       abc      <NA>
4    5678       xyz       xyz
5    3456      <NA>       bcd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...