创建一个新列,在其他列中查找值

时间:2019-04-23 21:18:45

标签: r dplyr

我有以下数据:

df <- data.frame(a=c(0,0,0,1,1,1),
                 b=c(1,2,3,1,2,3), 
                 c=c("a","b","c","x","y","z"),
                 stringsAsFactors = FALSE) 

df

#>   a b c
#> 1 0 1 a
#> 2 0 2 b
#> 3 0 3 c
#> 4 1 1 x
#> 5 1 2 y
#> 6 1 3 z

我想创建第4列“ d”,该列返回“ c”中的值,其中“ a” = 0且b = b,如下所示:

#>   a b c d
#> 1 0 1 a a
#> 2 0 2 b b
#> 3 0 3 c c
#> 4 1 1 x a
#> 5 1 2 y b
#> 6 1 3 z c

我尝试过:

df %>% mutate(d = c[a==0 & b==b])

但这不起作用。

如何使用dplyr创建列“ d”?

3 个答案:

答案 0 :(得分:3)

一种dplyr解决方案:

df1 <-  df[df$a == 0,-1]
inner_join(df, df1, by = "b")

#   a b c.x c.y
# 1 0 1   a   a
# 2 0 2   b   b
# 3 0 3   c   c
# 4 1 1   x   a
# 5 1 2   y   b
# 6 1 3   z   c

答案 1 :(得分:2)

只有tidyverse可能是:

df %>%
 mutate(d = ifelse(a == 0, c, NA_character_)) %>%
 group_by(b) %>%
 fill(d)

      a     b c     d    
  <dbl> <dbl> <chr> <chr>
1     0     1 a     a    
2     1     1 x     a    
3     0     2 b     b    
4     1     2 y     b    
5     0     3 c     c    
6     1     3 z     c  

您还可以安排它:

df %>%
 mutate(d = ifelse(a == 0, c, NA_character_)) %>%
 group_by(b) %>%
 fill(d) %>%
 arrange(a, b, c)

      a     b c     d    
  <dbl> <dbl> <chr> <chr>
1     0     1 a     a    
2     0     2 b     b    
3     0     3 c     c    
4     1     1 x     a    
5     1     2 y     b    
6     1     3 z     c 

要应对@divibisan提到的情况,您可以执行以下操作:

df %>%
 mutate(d = ifelse(a == 0, c, NA_character_)) %>%
 group_by(b) %>%
 fill(d, .direction = "up") %>%
 fill(d, .direction = "down") %>%
 arrange(a, b, c)

答案 2 :(得分:2)

使用基数R,您可以执行以下操作。

inx <- match(df$b, df$b[df$a == 0])
df$d <- df$c[inx]

df
#  a b c d
#1 0 1 a a
#2 0 2 b b
#3 0 3 c c
#4 1 1 x a
#5 1 2 y b
#6 1 3 z c