汇总多组列 [英] Summing Multiple Groups of Columns
问题描述
我遇到的情况是我的数据框包含图像分析结果,其中列是图像中特定类的比例,因此示例数据框class_df
看起来像:
I have a situation where my data frame contains the results of image analysis where the columns are the proportion of a particular class present in the image, such that an example dataframe class_df
would look like:
id A B C D E F
1 0.20 0.30 0.10 0.15 0.25 0.00
2 0.05 0.10 0.05 0.30 0.10 0.40
3 0.10 0.10 0.10 0.20 0.20 0.30
这些类中的每一个都属于一个功能组,我想创建一个新列,其中根据这些类计算每个功能组的比例.映射class_fg
Each of these classes belongs to a functional group and I want to create new columns where the proportions of each functional group are calculated from the classes. An example mapping class_fg
class fg
A Z
B Z
C Z
D Y
E Y
F X
期望的结果将是(添加了一行以显示期望的新列):
and the desired result would be (line added to show the desired new columns):
id A B C D E F | X Y Z
1 0.20 0.30 0.10 0.15 0.25 0.00 | 0.00 0.40 0.60
2 0.05 0.10 0.05 0.30 0.10 0.40 | 0.40 0.40 0.20
3 0.10 0.10 0.10 0.20 0.20 0.30 | 0.30 0.40 0.30
我可以一次使用一个功能组来完成
And I can do it one functional group at a time using
first_fg <- class_fg %>%
filter(fg == "Z") %>%
select(class) %>%
unlist()
class_df <- class_df %>%
mutate(Z = rowSums(select(., one_of(first_fg))))
当然,有更好的方法可以计算每个功能组的行总和,而不必为每个组重复此代码?也许使用purrr?
Surely there is a better way to do this where I can calculate the row sum for each functional group without having to just repeat this code for each group? Maybe using purrr?
推荐答案
我们可以通过split
'class_df',用map
,select
列中的list
元素循环class_df'并获取rowSums
We could split
the 'class_df' by 'class', loop through the list
elements with map
, select
the columns of 'class_df' and get the rowSums
library(tidyverse)
class_fg %>%
split(.$fg) %>%
map_df(~ class_df %>%
select(one_of(.x$class)) %>%
rowSums) %>%
bind_cols(class_df, .)
# id A B C D E F X Y Z
#1 1 0.20 0.3 0.10 0.15 0.25 0.0 0.0 0.4 0.6
#2 2 0.05 0.1 0.05 0.30 0.10 0.4 0.4 0.4 0.2
#3 3 0.10 0.1 0.10 0.20 0.20 0.3 0.3 0.4 0.3
或者通过nest
进行分组,然后通过map
对list
元素进行ping操作来进行rowSums
Or do a group by nest
ing, and then do the rowSums
by map
ping over the list
elements
class_fg %>%
group_by(fg) %>%
nest %>%
mutate(out = map(data, ~ class_df %>%
select(one_of(.x$class)) %>%
rowSums)) %>%
select(-data) %>%
unnest %>%
unstack(., out ~ fg) %>%
bind_cols(class_df, .)
这篇关于汇总多组列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!