我想对这个数据框中的所有数字列求和。
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
答案 0 :(得分:2)
我将使用summarise_at
,仅对非数字列创建一个逻辑向量FALSE
,否则对Registered
和TRUE
作一个逻辑向量,即
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)
例如,在“类型”是虹膜数据集中的非数字(字符)列的情况下,“类型”是“种类”列。因此,我得到了其他所有碰巧都是数字的列的总和。