使用mutate创建一个新列,其中包含R中每个组的第一个值

时间:2016-05-07 23:08:11

标签: r dataframe

我目前正在进行一项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

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

3 个答案:

答案 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]