【发布时间】:2014-12-05 13:28:35
【问题描述】:
我想在我的数据框中创建一个列,我可以将数据框的另外两列相加。
df <- data.frame(x = 1:10, y = 11:20)
例如,我想在我拥有的地方添加第三列 z:
z <- c(12, 14, 16,..., 30)
提前致谢。
【问题讨论】:
-
你是怎么解决的?
-
这对我来说没问题。如果您不喜欢它,请投反对票。
我想在我的数据框中创建一个列,我可以将数据框的另外两列相加。
df <- data.frame(x = 1:10, y = 11:20)
例如,我想在我拥有的地方添加第三列 z:
z <- c(12, 14, 16,..., 30)
提前致谢。
【问题讨论】:
df <- data.frame(x = 1:10, y = 11:20)
df$z<-c(df$x+df$y)
df
x y z
1 1 11 12
2 2 12 14
3 3 13 16
4 4 14 18
5 5 15 20
6 6 16 22
7 7 17 24
8 8 18 26
9 9 19 28
10 10 20 30
【讨论】:
with 的功能在这里很方便。 df$z <- with(df, x + y).
R 中的算术是vectorized。这是一个非常重要的概念,您应该阅读。数据框中的列是向量,因此您的解决方案很简单:
df$z <- df$x + df$y
df$z
## [1] 12 14 16 18 20 22 24 26 28 30
就像您刚刚拥有 x 和 y 独立向量一样:
x <- 1:10
y <- 11:20
x + y
## [1] 12 14 16 18 20 22 24 26 28 30
【讨论】:
函数rowSums 可以解决问题:
df$z <- rowSums(df)
结果:
x y z
1 1 11 12
2 2 12 14
3 3 13 16
4 4 14 18
5 5 15 20
6 6 16 22
7 7 17 24
8 8 18 26
9 9 19 28
10 10 20 30
【讨论】:
使用 data.table :
> library(data.table)
> setDT(df)[,z:=x+y,]
> df
x y z
1: 1 11 12
2: 2 12 14
3: 3 13 16
4: 4 14 18
5: 5 15 20
6: 6 16 22
7: 7 17 24
8: 8 18 26
9: 9 19 28
10: 10 20 30
【讨论】:
使用 dplyr:
library(dplyr)
df %>% group_by(x) %>% mutate(z = sum(x+y))
我在这个答案中学到的其他两个选项,以避免分组和写列名称Sum across multiple columns with dplyr
df %>% mutate(z = Reduce(`+`, .))
df %>% mutate(z = rowSums(.))
输出:
Source: local data frame [10 x 3]
Groups: x
x y z
1 1 11 12
2 2 12 14
3 3 13 16
4 4 14 18
5 5 15 20
6 6 16 22
7 7 17 24
8 8 18 26
9 9 19 28
10 10 20 30
【讨论】:
x分组?
df %>% mutate(z = sum(x+y)),z 列将是每行 210(df$x+df$y 的总和)。我可以使用df %>% mutate(z = rowSums(.)) 或df %>% mutate(z = Reduce(+, .)) 来避免分组。我会将它们添加到我的答案中。