我有以下数据:
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”?
答案 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