关于数据框:使用mutate以R中每个组的第一个值创建一个新列

Using mutate to create a new column with the first value of each group in R

我目前正在从事Sabermetric研究项目,整日忙于尝试在数据框中创建一个新列,以显示给定游戏的起始投手。 本质上,如果我使用下面的示例,则具有" a"和" b"的数据,但是我不知道如何为" a"的每个唯一值创建" c"作为" b"的第一个值 '。 这应该很容易,但是我刚刚开始学习R。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    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

到目前为止,我已经使用mutategroup_by提出了
sample <- sample %>% group_by(a) %>% mutate(c = first(b))
但这只是使" c"的每个值成为第一个" b"的第一个值。 因此,在上面的示例中,我当前的代码使'c'的每个值等于1。
我缺少什么,有什么建议吗?


我们可以使用base R

1
 df1$c <- with(df1, ave(b, a, FUN= function(x) head(x,1)))

或使用data.table

1
2
library(data.table)
setDT(df1)[, c:= head(b, 1), by = a]

使用库dplyr,您可以执行以下操作:

1
2
library(dplyr)
df %>% group_by(a) %>% mutate(c = b[1])

输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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


不太优雅,但是可以用,我希望它也对您有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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