我目前正在进行一项Sabermetric研究项目,我整天都在努力在数据框架中创建一个新专栏,以显示给定游戏的起始投手。基本上,如果我使用下面的示例,我有'a'和'b'的数据,但我无法弄清楚如何创建'c'作为'a'的每个唯一值的'b'的第一个值”。这应该很容易,但我刚开始学习R。
a b c
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 1 5 1
6 1 6 1
7 2 7 7
8 2 8 7
9 2 1 7
10 2 2 7
11 2 3 7
12 2 4 7
13 3 5 5
14 3 6 5
15 3 7 5
到目前为止,我已经使用mutate
和group_by
来提出
sample <- sample %>% group_by(a) %>% mutate(c = first(b))
但这只是使'c'的每个值成为第一个'b'的第一个值。因此,在上面的示例中,我的当前代码使'c'的每个值都等于1。
我错过了什么,有什么建议吗?
答案 0 :(得分:1)
不是很优雅,但它有效,我希望它也适合你:
df1 %>% group_by(a) %>% mutate(c = rep(first(b), length(a)))
Source: local data frame [15 x 3]
Groups: a [3]
a b c
(int) (int) (int)
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 1 5 1
6 1 6 1
7 2 7 7
8 2 8 7
9 2 1 7
10 2 2 7
11 2 3 7
12 2 4 7
13 3 5 5
14 3 6 5
15 3 7 5
答案 1 :(得分:1)
使用库dplyr
,您可以执行以下操作:
library(dplyr)
df %>% group_by(a) %>% mutate(c = b[1])
输出如下:
Source: local data frame [15 x 3]
Groups: a [3]
a b c
(int) (int) (int)
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 1 5 1
6 1 6 1
7 2 7 7
8 2 8 7
9 2 1 7
10 2 2 7
11 2 3 7
12 2 4 7
13 3 5 5
14 3 6 5
15 3 7 5
在注释和运行代码中将列更改为下面提到的类型会产生所需的输出:
df$b <- as.factor(df$b)
df$a <- as.character(df$a)
str(df)
'data.frame': 15 obs. of 3 variables:
$ a: chr "1" "1" "1" "1" ...
$ b: Factor w/ 8 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 1 2 ...
$ c: int 1 1 1 1 1 1 7 7 7 7 ...
df %>% group_by(a) %>% mutate(c = b[1])
Source: local data frame [15 x 3]
Groups: a [3]
a b c
(chr) (fctr) (fctr)
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 1 5 1
6 1 6 1
7 2 7 7
8 2 8 7
9 2 1 7
10 2 2 7
11 2 3 7
12 2 4 7
13 3 5 5
14 3 6 5
15 3 7 5
答案 2 :(得分:1)
我们可以使用base R
df1$c <- with(df1, ave(b, a, FUN= function(x) head(x,1)))
或data.table
library(data.table)
setDT(df1)[, c:= head(b, 1), by = a]