Существует ли функция R для замены значений в одном кадре данных ТОЛЬКО из другого ТОЛЬКО, если значения из другой общей переменной равны? - PullRequest
2 голосов
/ 24 мая 2019

У меня есть два ДФС. Я хочу перенести значения из столбца в одном df в столбец в другом df ТОЛЬКО, когда значения из другого столбца совпадают через обе dfs.

Первый df выглядит так:

A = data.frame(name = c('Ann', 'Charlie', 'James', 'Mary'),
count = c(0,0,0,0))

Второй df выглядит так:

B = data.frame(name = c('Charlie', 'Mary'), count = (4, 11))

Я хочу изменить значения счетчика с df A на значения счетчика с df B, где имена в df B совпадают с именами в A:

Новый DF A:

name      count 
Anne        0
Charlie     4
James       0
Mary        11

Есть ли способ использовать dplyr для этого?

Ответы [ 3 ]

2 голосов
/ 24 мая 2019

A %>% rename(count_A = count) %>% left_join(B %>% rename(count_B = count), by = 'name') %>% mutate(count = ifelse(is.na(count_B), count_A, count_B))

1 голос
/ 24 мая 2019

Соединение dplyr вместе с функцией coalesce должно помочь:

library(dyplr)

A %>% 
  left_join(B, by = "name") %>% 
  mutate(count = coalesce(count.y, count.x)) %>% 
  select(-count.x, -count.y)
0 голосов
/ 24 мая 2019

Вот как вы можете это сделать:

> dplyr::left_join(A, B, "name") %>%
      rowwise() %>%
      transmute(name, count = sum(count.x, count.y, na.rm = TRUE))
Source: local data frame [4 x 2]
Groups: <by row>

# A tibble: 4 x 2
  name    count
  <chr>   <dbl>
1 Anne        0
2 Charlie     4
3 James       0
4 Mary       11

Или

> left_join(A, B, "name") %>%
      transmute(name, count = rowSums(select(., starts_with("count")), na.rm = TRUE))
     name count
1    Anne     0
2 Charlie     4
3   James     0
4    Mary    11

Предостережение: Я где-то читал (не помню где)что второй подход не поддерживается проектом, но он дает правильный ответ.

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