在dplyr :: mutate中,如何选择特定的行?

时间:2016-07-16 05:58:07

标签: r dplyr plyr

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

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

我想在a

时创建一个新列(按v分组),其值为b==4

使用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的组合,但到目前为止还没有解决方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

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

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])

来自mutate的{​​{1}}可能会被dplyr中的mutate屏蔽掉

使用plyr,OP帖子中的代码会给我错误

dplyr_0.5.0