如何汇总除我指定的列以外的所有列?

时间:2018-11-28 15:16:54

标签: r dplyr

我想对这个数据框中的所有数字列求和。

Group, Registered, Votes, Beans
A,     111,        12,     100
A,     111,        13,     200
A,     111,        14,     300

我想按Group对此分组,总结除Registered以外的所有列。

summarise_if(
  .tbl = group_by(
    .data = x,
    Precinct
  ),
  .predicate = is.numeric,
  .funs = sum
)

问题出在这里,结果是一个数据帧将所有数字列加起来,包括Registered。除了Registered之外,我如何求和?

我想要的输出看起来像这样

Group, Registered, Votes, Beans
A,     111,        39,    600

4 个答案:

答案 0 :(得分:2)

我将使用summarise_at,仅对非数字列创建一个逻辑向量FALSE,否则对RegisteredTRUE作一个逻辑向量,即

df %>% 
  summarise_at(which(sapply(df, is.numeric) & names(df) != 'Registered'), sum)

如果您只想汇总除一栏之外的所有内容,则可以

df %>% 
  summarise_at(vars(-Registered), sum)

但是在这种情况下,您还必须检查它是否也是数字。

注意:

  • 因子在技术上是数值型的,因此,如果要排除非数字列因子,请将sapply(df, is.numeric)替换为sapply(df, function(x) is.numeric(x) & !is.factor(x))

  • 如果您的数据很大,我认为使用sapply(df[1,], is.numeric)而不是sapply(df, is.numeric)更快。 (如果我错了,请纠正我)

答案 1 :(得分:2)

dt = read.table(text = "
Group Registered Votes Beans
A     111        12     100
A     111        13     200
A     111        14     300
", header=T)

library(dplyr)

# specify grouping variables
v1 = "Group"
v2 = "Registered"

dt %>%
  group_by_(v1, v2) %>%
  summarise_all(sum) %>%
  ungroup()

# # A tibble: 1 x 4
#     Group Registered Votes Beans
#     <fct>      <int> <int> <int>
#   1 A            111    39   600

请注意,我必须假设在每个Group值中都有一个唯一的Registered值,因此您可以按两个变量进行分组,而不是仅按Group进行分组并保持唯一性值Registered

答案 2 :(得分:0)

我们可以使用summarise_if

library(dplyr)
df %>% 
   select(-Registered) %>%
   summarise_if(is.numeric, sum)
#  Votes Beans
#1    39   600

答案 3 :(得分:0)

我需要类似的东西,因此通过使用@akrun This answer above的答案,我做到了

df <- as_tibble(df)

df %>%
select(-Type) %>%
summarise_all(sum)

例如,在“类型”是虹膜数据集中的非数字(字符)列的情况下,“类型”是“种类”列。因此,我得到了其他所有碰巧都是数字的列的总和。