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