2017-08-11 107 views
0

我有一个带分组变量的数据框,我想按组对它们进行求和。 dplyr很简单。按组求和多个变量,并用它们的总和创建新列

library(dplyr) 
library(magrittr) 

data <- data.frame(group = c("a", "a", "b", "c", "c"), n1 = 1:5, n2 = 2:6) 

data %>% group_by(group) %>% 
    summarise_all(sum) 

# A tibble: 3 x 3 
    group n1 n2 
    <fctr> <int> <int> 
1  a  3  5 
2  b  3  4 
3  c  9 11 

但现在我想的n1n2按组总和的新列total。像这样:

# A tibble: 3 x 3 
    group n1 n2 ttl 
    <fctr> <int> <int> <int> 
1  a  3  5  8 
2  b  3  4  7 
3  c  9 11 20 

我怎么用dplyr来做到这一点?

编辑: 其实,这只是一个例子,我有很多变数。

我试过这两个代码,但它不是在正确的尺寸...

data %>% group_by(group) %>% 
    summarise_all(sum) %>% 
    summarise_if(is.numeric, sum) 

data %>% group_by(group) %>% 
    summarise_all(sum) %>% 
    mutate_if(is.numeric, .funs = sum) 
+0

我编辑,以避免混淆:我有很多的变数,我不想做N1 + N2 + ... – AntoineBic

回答

3

您可以使用mutatesummarize

data %>% 
    group_by(group) %>% 
    summarise_all(sum) %>% 
    mutate(tt1 = n1 + n2) 

# A tibble: 3 x 4 
# group n1 n2 tt1 
# <fctr> <int> <int> <int> 
#1  a  3  5  8 
#2  b  3  4  7 
#3  c  9 11 20 

如果需要总结的所有数字列,可以使用rowSumsselect_if(用于选择数字列)将列总计为:

data %>% 
    group_by(group) %>% 
    summarise_all(sum) %>% 
    mutate(tt1 = rowSums(select_if(., is.numeric))) 

# A tibble: 3 x 4 
# group n1 n2 tt1 
# <fctr> <int> <int> <dbl> 
#1  a  3  5  8 
#2  b  3  4  7 
#3  c  9 11 20 
+0

我编辑,以避免混淆:我有很多的变数,我不想要做n1 + n2 + ... – AntoineBic

+0

不错,select_if,谢谢! – AntoineBic

+0

不客气! – Psidom

1

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(data)),按'group'分组,得到data.table子集中每列的sum,然后用Reduce得到sum的行感兴趣的列

library(data.table) 
setDT(data)[, lapply(.SD, sum) , group][, tt1 := Reduce(`+`, .SD), 
         .SDcols = names(data)[-1]][] 
# group n1 n2 tt1 
#1:  a 3 5 8 
#2:  b 3 4 7 
#3:  c 9 11 20 

或用base R

addmargins(as.matrix(rowsum(data[-1], data$group)), 2) 
# n1 n2 Sum 
#a 3 5 8 
#b 3 4 7 
#c 9 11 20 

或用dplyr

data %>% 
    group_by(group) %>% 
    summarise_all(sum) %>% 
    mutate(tt = rowSums(.[-1])) 
1

基础R

cbind(aggregate(.~group, data, sum), ttl = sapply(split(data[,-1], data$group), sum)) 
# group n1 n2 ttl 
#a  a 3 5 8 
#b  b 3 4 7 
#c  c 9 11 20 
1

我们可以与dplyr功能一起使用apply

data <- data.frame(group = c("a", "a", "b", "c", "c"), n1 = 1:5, n2 = 2:6) 

data %>% group_by(group) %>% 
    summarise_all(sum) %>% 
    mutate(ttl = apply(.[, 2:ncol(.)], 1, sum)) 

# A tibble: 3 × 4 
    group n1 n2 ttl 
    <fctr> <int> <int> <int> 
1  a  3  5  8 
2  b  3  4  7 
3  c  9 11 20 

rowSums具有相同的策略。关键是使用.指定数据帧,使用[]x:ncol(.)来保留所需的列。

data %>% group_by(group) %>% 
    summarise_all(sum) %>% 
    mutate(ttl = rowSums(.[, 2:ncol(.)])) 

# A tibble: 3 × 4 
    group n1 n2 ttl 
    <fctr> <int> <int> <dbl> 
1  a  3  5  8 
2  b  3  4  7 
3  c  9 11 20 
+0

它适用于,谢谢! – AntoineBic

相关问题