嗯,我知道已经有很多相关的问题,但没有一个能回答我的特殊需求。
我想在50列的表上使用dplyr“summarize”,我需要对这些列应用不同的汇总函数。
“Summarize_all”和“summarize_at”似乎都有缺点,即不可能将不同的函数应用于不同的变量子组。
举个例子,我们假设虹膜数据集有50列,所以我们不希望按名称来寻址列。我希望前两列的总和,第三列的平均值和所有剩余列的第一个值(在group_by(Species)之后)。我怎么能这样做?
答案 0 :(得分:4)
幸运的是,现在有一种更简单的方法。
随着新的dplyr 1.0.0即将面世,您可以利用across
函数来实现此目的。
您需要输入的是:
iris %>%
group_by(Species) %>%
summarize(
# I want the sum over the first two columns,
across(c(1,2), sum),
# the mean over the third
across(3, mean),
# the first value for all remaining columns (after a group_by(Species))
across(-c(1:3), first)
)
太好了,不是吗?
我首先认为跨接不是必需的,因为范围变体工作得很好,但是这种用例正是across
函数非常有益的原因。
您可以通过devtools::install_github("tidyverse/dplyr")
答案 1 :(得分:3)
正如其他人所提到的,这通常是通过为要应用汇总功能的每组列调用summarize_each
/ summarize_at
/ summarize_if
来完成的。据我所知,您必须创建一个自定义函数,对每个子集执行汇总。例如,您可以使用选择帮助程序(例如contains()
)来设置列名,以仅过滤要应用该功能的列。如果没有,则可以设置要汇总的特定列号。
对于您提到的示例,您可以尝试以下操作:
summarizer <- function(tb, colsone, colstwo, colsthree,
funsone, funstwo, funsthree, group_name) {
return(bind_cols(
summarize_all(select(tb, colsone), .funs = funsone),
summarize_all(select(tb, colstwo), .funs = funstwo) %>%
ungroup() %>% select(-matches(group_name)),
summarize_all(select(tb, colsthree), .funs = funsthree) %>%
ungroup() %>% select(-matches(group_name))
))
}
#With colnames
iris %>% as.tibble() %>%
group_by(Species) %>%
summarizer(colsone = contains("Sepal"),
colstwo = matches("Petal.Length"),
colsthree = c(-contains("Sepal"), -matches("Petal.Length")),
funsone = "sum",
funstwo = "mean",
funsthree = "first",
group_name = "Species")
#With indexes
iris %>% as.tibble() %>%
group_by(Species) %>%
summarizer(colsone = 1:2,
colstwo = 3,
colsthree = 4,
funsone = "sum",
funstwo = "mean",
funsthree = "first",
group_name = "Species")
答案 2 :(得分:1)
您可以单独汇总每个函数的数据,然后在需要时加入数据。
对于虹膜的例子,这样的事情是这样的:
sums <- iris %>% group_by(Species) %>% summarise_at(1:2, sum)
means <- iris %>% group_by(Species) %>% summarise_at(3, mean)
firsts <- iris %>% group_by(Species) %>% summarise_at(4, first)
full_join(sums, means) %>% full_join(firsts)
如果您需要使用多个总结功能,我会尝试考虑别的事情。
答案 3 :(得分:0)
试试这个:
library(plyr)
library(dplyr)
dataframe <- data.frame(var = c(1,1,1,2,2,2),var2 = c(10,9,8,7,6,5),var3=c(2,3,4,5,6,7),var4=c(5,5,3,2,4,2))
dataframe
# var var2 var3 var4
#1 1 10 2 5
#2 1 9 3 5
#3 1 8 4 3
#4 2 7 5 2
#5 2 6 6 4
#6 2 5 7 2
funnames<-c(sum,mean,first)
colnums<-c(2,3,4)
ddply(.data = dataframe,.variables = "var",
function(x,funcs,inds){
mapply(function(func,ind){
func(x[,ind])
},funcs,inds)
},funnames,colnums)
# var V1 V2 V3
#1 1 27 3 5
#2 2 18 6 2
答案 4 :(得分:0)
请参见this-功能即将推出