我想改变数据框(分组)并创建一个新变量,该变量具有特定行(在组内)的列值。让我们看一个例子:
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
的组合,但到目前为止还没有解决方法。
有什么想法吗?
答案 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