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 |
到目前为止,我已经使用
但这只是使" c"的每个值成为第一个" b"的第一个值。 因此,在上面的示例中,我当前的代码使'c'的每个值等于1。
我缺少什么,有什么建议吗?
我们可以使用
1 | df1$c <- with(df1, ave(b, a, FUN= function(x) head(x,1))) |
或使用
1 2 | library(data.table) setDT(df1)[, c:= head(b, 1), by = a] |
使用库
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 |