2014-10-10 2 views
0

Я хочу создать столбец в моей кадре данных, где я мог бы суммировать два других столбца данных.Совокупность двух столбцов строка за строкой

df <- data.frame(x = 1:10, y = 11:20) 

Вот, например, я хочу, чтобы добавить третий столбец г, где у меня есть:

z <- c(12, 14, 16,..., 30) 

Спасибо заранее.

+2

Как вы пытались его решить? – fileunderwater

+0

Это выглядит хорошо для меня. Если вам это не нравится, проголосуйте. – ArtOfWarfare

ответ

6

Арифметика в 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 
+0

Большое спасибо –

2
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 
+0

Функциональность 'with' пригодится здесь. 'df $ z <- с (df, x + y)'. –

7

функции 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 
2

Использование 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 
1

Использование 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 
+0

Зачем вам нужно группировать 'x'? –

+0

@Richard Scriven Если я не группирую по x, 'df%>% mutate (z = sum (x + y))', столбец z будет 210 в каждой строке (сумма df $ x + df $ у). Я мог бы использовать 'df%>% mutate (z = rowSums (.))' Или 'df%>% mutate (z = Уменьшить (+,.))', Чтобы избежать группировки. Я добавлю их к своему ответу. – mpalanco