是否存在R函数,以便仅当来自另一个公共变量的值相等时,才用另一个数据框中的值替换一个数据框中的值?

时间:2019-05-24 02:05:07

标签: r dataframe merge dplyr

我有两个df。我只想将另一列中的值穿过两个dfs时,才将一个df中的列的值传输到另一df中的列。

第一个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中的名称与A中的名称匹配的df B中的计数值:

新df A:

name      count 
Anne        0
Charlie     4
James       0
Mary        11

有没有办法使用dplyr?

3 个答案:

答案 0 :(得分:2)

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 :(得分:1)

dplyr joinscoalesce函数应该可以解决问题:

library(dyplr)

A %>% 
  left_join(B, by = "name") %>% 
  mutate(count = coalesce(count.y, count.x)) %>% 
  select(-count.x, -count.y)

答案 2 :(得分:0)

您可以在此处完成此操作:

> 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

注意事项:我在某处(我不记得在哪里)读到第二种方法不受设计支持,但确实给出了正确的答案。