在dplyr::mutate中,如何select特定行?

In dplyr::mutate, how to select a particular row?

我想改变一个数据框(分组)并创建一个新变量,该变量具有特定行(组内)的列值。让我们看一个例子:

df=data.frame(a=rep(c("a","b","c"),each=4),b=rep(c(1,2,3,4),3),v=1:12)

这给了我数据框 a b v 1 a 1 1 2 a 2 2 3 a 3 3 4 a 4 4 5 b 1 5 6 b 2 6 7 b 3 7 8 b 4 8 9 c 1 9 10 c 2 10 11 c 3 11 12 c 4 12

我想在 b==4

时创建一个值为 v 的新列(按 a 分组)

我会用plyr(有点不雅)

plyr::ddply(df, ~a, function(x) cbind(x,z=x[x$b==4,]$v))

这给了我想要的东西: a b v z 1 a 1 1 4 2 a 2 2 4 3 a 3 3 4 4 a 4 4 4 5 b 1 5 8 6 b 2 6 8 7 b 3 7 8 8 b 4 8 8 9 c 1 9 12 10 c 2 10 12 11 c 3 11 12 12 c 4 12 12

dplyr我想要

df2 <- df %>% group_by(a) %>% mutate(z=.[.$b==4,"v"])

这给了我

Source: local data frame [12 x 4]
Groups: a [3]

       a     b     v        z
   (chr) (dbl) (int)    (chr)
1      a     1     1 <int[3]>
2      a     2     2 <int[3]>
3      a     3     3 <int[3]>
4      a     4     4 <int[3]>
5      b     1     5 <int[3]>
6      b     2     6 <int[3]>
7      b     3     7 <int[3]>
8      b     4     8 <int[3]>
9      c     1     9 <int[3]>
10     c     2    10 <int[3]> 
11     c     3    11 <int[3]>
12     c     4    12 <int[3]>

z 列是

来源:本地数据框 [3 x 12]

     NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA    NA
  (int) (int) (int) (int) (int) (int) (int) (int) (int) (int) (int) (int)
1     4     4     4     4     4     4     4     4     4     4     4     4
2     8     8     8     8     8     8     8     8     8     8     8     8
3    12    12    12    12    12    12    12    12    12    12    12    12

我也试过 filter { }merge 的组合,但到目前为止没有解决方案。

有什么想法吗?

我们不需要.$b,直接用b==4就可以了(假设'b'中的每组只有一个4'a'

df %>%
    group_by(a) %>% 
    mutate(z = v[b==4])
#       a     b     v     z
#   <fctr> <dbl> <int> <int>
#1       a     1     1     4
#2       a     2     2     4
#3       a     3     3     4
#4       a     4     4     4
#5       b     1     5     8
#6       b     2     6     8
#7       b     3     7     8
#8       b     4     8     8
#9       c     1     9    12
#10      c     2    10    12
#11      c     3    11    12
#12      c     4    12    12

如果我们已经加载了plyr库,使用

可能会更好
 dplyr::mutate(z = v[b==4])

因为 dplyr 中的 mutate 可以从 plyr

中的 mutate 中屏蔽掉

使用 dplyr_0.5.0,OP post 中的代码给我错误

df %>%
   group_by(a) %>% 
   mutate(z=.[.$b==4,"v"])
#Error: not compatible with STRSXP