如何使用dplyr根据另一列的不同值填充新列中的不同值?

时间:2018-03-28 01:26:10

标签: r dplyr

这是我的数据:

a <- data.frame(x=c('A','A','A','B','B','B'),
                y=c('Yes','No','No','Yes','No','No'),
                z=c(1,2,3,4,5,6))

我想以这种方式生成一个新列:

  1. x分组,因此所有A都在一个组中,所有B在另一个组中
  2. 对于每个组,如果y=Yes,则将z值保留在新列中。如果是y=No,则将z值与y=Yes一起使用。
  3. 因此,新数据应如下所示:

    x    y   z   z1
    A   Yes  1   1
    A   No   2   1
    A   No   3   1
    B   Yes  4   4
    B   No   5   4
    B   No   6   4
    

    我可以用这种方式来做:

    a1 <- a %>%
       filter(y=='Yes') %>%
       distinct(x,y,z)
     a2 <- a %>%
        left_join(a1,by='x') %>%...
    

    但是这样,我必须生成a1作为中间人。如何在一个管道中执行此操作而不在我的示例中生成像a1这样的新变量?

1 个答案:

答案 0 :(得分:1)

您可以组合两个管道并一次执行相同的功能。

...即

    a <- data.frame(x=c('A','A','A','B','B','B'),
                    y=c('Yes','No','No','Yes','No','No'),
                    z=c(1,2,3,4,5,6))

    a %>% left_join(a %>% filter(y=='Yes') %>% distinct(x,y,z), by='x') %>% select(-y.y)

这导致重复的列标记为.x和.y作为连接的结果。