Объединение двух фреймов данных без дублирования значений metri c - PullRequest
2 голосов
/ 31 января 2020

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

Вот пример двух наборы данных, которые у меня есть:

набор данных 1:

+-------------+-----------+------------+-------------+
| leader name | leader id | total runs | total walks |
+-------------+-----------+------------+-------------+
| ab          |        11 |          4 |           9 |
| tg          |        47 |          8 |           3 |
+-------------+-----------+------------+-------------+

набор данных 2:

+-------------+-----------+--------------+-----------+
| leader name | leader id | member name  | member id |
+-------------+-----------+--------------+-----------+
| ab          |        11 | gfh          |       589 |
| ab          |        11 | tyu          |       739 |
| tg          |        47 | rtf          |       745 |
| tg          |        47 | jke          |       996 |
+-------------+-----------+--------------+-----------+

Я хочу объединить два набора данных, чтобы они стали похожими это:

+-------------+-----------+--------------+------------+------------+-------------+
| leader name | leader id | member name  | member id  | total runs | total walks |
+-------------+-----------+--------------+------------+------------+-------------+
| ab          |        11 | gfh          |        589 |          4 |           9 |
| ab          |        11 | tyu          |        739 |            |             |
| tg          |        47 | rtf          |        745 |          8 |           3 |
| tg          |        47 | jke          |        996 |            |             |
+-------------+-----------+--------------+------------+------------+-------------+

Но сейчас я продолжаю получать:

+-------------+-----------+--------------+------------+------------+-------------+
| leader name | leader id | member name  | member id  | total runs | total walks |
+-------------+-----------+--------------+------------+------------+-------------+
| ab          |        11 | gfh          |        589 |          4 |           9 |
| ab          |        11 | tyu          |        739 |          4 |           9 |
| tg          |        47 | rtf          |        745 |          8 |           3 |
| tg          |        47 | jke          |        996 |          8 |           3 |
+-------------+-----------+--------------+------------+------------+-------------+

Не имеет значения, пустые они, NA или 0, если значения не являются тиражирование. Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 31 января 2020

Мы можем сделать replace для этих «итоговых» столбцов после left_join

library(dplyr)
left_join(df2, df1 ) %>%
      group_by(leadername) %>%
      mutate_at(vars(starts_with('total')), ~ replace(., row_number() > 1, NA))
# A tibble: 4 x 6
# Groups:   leadername [2]
#  leadername leaderid membername memberid totalruns totalwalks
#  <chr>         <dbl> <chr>         <dbl>     <dbl>      <dbl>
#1 ab               11 gfh             589         4          9
#2 ab               11 tyu             739        NA         NA
#3 tg               47 rtf             745         8          3
#4 tg               47 jke             996        NA         NA

Или без использования group_by

left_join(df2, df1 ) %>%
     mutate_at(vars(starts_with('total')), ~ 
         replace(., duplicated(leadername), NA))

Или base R опция

out <- merge(df2, df1, all.x = TRUE)
i1 <- duplicated(out$leadername)
out[i1, c("totalruns", "totalwalks")] <- NA
out
#  leadername leaderid membername memberid totalruns totalwalks
#1         ab       11        gfh      589         4          9
#2         ab       11        tyu      739        NA         NA
#3         tg       47        rtf      745         8          3
#4         tg       47        jke      996        NA         NA

data

df1 <- structure(list(leadername = c("ab", "tg"), leaderid = c(11, 47
), totalruns = c(4, 8), totalwalks = c(9, 3)), class = "data.frame", row.names = c(NA, 
-2L))

df2 <- structure(list(leadername = c("ab", "ab", "tg", "tg"), leaderid = c(11, 
11, 47, 47), membername = c("gfh", "tyu", "rtf", "jke"), memberid = c(589, 
739, 745, 996)), class = "data.frame", row.names = c(NA, -4L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...