如何使用dplyr对另一个(分组的)列进行条件化来汇总多个列?

ztl

我需要以summarize通用方式跨多个列的data.frame:

  • 第一个summarize操作很容易,例如简单的中位数,并且很简单;
  • summarize然后,第二个条件在另一列中包含一个条件,例如,在另一列中采用最小值(按组)的值:
set.seed(4)

myDF = data.frame(i = rep(1:3, each=3),
                  j = rnorm(9),
                  a = sample.int(9),
                  b = sample.int(9),
                  c = sample.int(9),
                  d = 'foo')
#   i          j a b c   d
# 1 1  0.2167549 4 5 5 foo
# 2 1 -0.5424926 7 7 4 foo
# 3 1  0.8911446 3 9 1 foo
# 4 2  0.5959806 8 6 8 foo
# 5 2  1.6356180 6 8 3 foo
# 6 2  0.6892754 1 4 6 foo
# 7 3 -1.2812466 9 1 7 foo
# 8 3 -0.2131445 5 2 2 foo
# 9 3  1.8965399 2 3 9 foo

myDF %>% group_by(i) %>% summarize(across(where(is.numeric), median, .names="med_{col}"),
                                   best_a = a[[which.min(j)]],
                                   best_b = b[[which.min(j)]],
                                   best_c = c[[which.min(j)]])
# # A tibble: 3 x 8
#      i   med_j med_a med_b med_c best_a best_b best_c
# * <int>   <dbl> <int> <int> <int>  <int>  <int>  <int>
# 1     1  0.217     4     7     4      7      7      4
# 2     2  0.689     6     6     6      8      6      8
# 3     3 -0.213     5     2     7      9      1      7

如何summarize以通用方式定义第二个操作(即,不像上面那样手动)?

因此,我需要这样的东西(显然不能正常工作,因为j无法识别):

myfns = list(med = ~median(.),
             best = ~.[[which.min(j)]])
myDF %>% group_by(i) %>% summarize(across(where(is.numeric), myfns, .names="{fn}_{col}"))
# Error: Problem with `summarise()` input `..1`.
# x object 'j' not found
# ℹ Input `..1` is `across(where(is.numeric), myfns, .names = "{fn}_{col}")`.
# ℹ The error occurred in group 1: i = 1.
罗纳克·沙

使用另一个across最小的a:c获取相应的值j

library(dplyr)

myDF %>% 
  group_by(i) %>% 
  summarize(across(where(is.numeric), median, .names="med_{col}"),
            across(a:c,  ~.[which.min(j)],.names = 'best_{col}'))

#      i  med_j med_a med_b med_c best_a best_b best_c
#* <int>  <dbl> <int> <int> <int>  <int>  <int>  <int>
#1     1  0.217     4     7     4      7      7      4
#2     2  0.689     6     6     6      8      6      8
#3     3 -0.213     5     2     7      9      1      7

要在同across一条语句中执行此操作:

myDF %>% 
  group_by(i) %>% 
  summarize(across(where(is.numeric), list(med = median, 
                                           best = ~.[which.min(j)]), 
                                      .names="{fn}_{col}"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对一列进行分组并获得另一个列的最大值并使用python返回整行

通过分组(以另一个变量为条件)对列进行R排序

当两个数据帧的列和索引完全相同时,如何通过匹配另一个数据帧的条件来对一个数据帧的数据进行分组?

使用来自另一个表的汇总值更新一个表的多个列

r如何根据条件更改多个列(在另一个列中重复)

如何使用dplyr创建一个平均数据为2列并由另一个变量分组的新数据框?

在Dataframe中对列进行分组,并使用分组的数据创建另一个数据框

在对条件语句进行汇总时,对一列进行分组并创建一个新列

MySQL如何使用外键来识别另一个表中的列?

使用dplyr添加另一个分组

如何通过与另一个表的多个列匹配来获取列的所有ID?

使用另一个 df 计算一个 df 的多个列中值的条件出现

如何使用 count(*) 从另一个具有条件和分组依据的表中进行选择?

如何汇总多列并将结果放入另一个现有列?

如何按另一个表中某一列的最新最近日期对行进行分组?

以时间间隔对年龄进行分组以使用 r 中的另一个变量创建列联表

如何使用另一个表中的值更新 PostgreSQL 上的多个列

如何通过与另一个表的id列进行比较来更新表中的记录?

使用条件从另一个数据框中更新值来更新pandas数据框列

根据另一个(相同的行数)数据框对列进行分组

根据另一个数据框对数据框的列进行分组

根据来自另一个数据框的多个列条件创建列

Sqlite:从具有多个条件的另一个表中的多个列更新

如何通过使用另一个表中的不同列的值来显示另一个表中的字段的值

按一个值分组,然后对另一个值进行平均,其中另一个值成为列

如何将一个列数组与另一个进行比较?

如何使用计数和分组依据作为另一个表的条件

我如何解决此for循环,该循环在一个列中使用一个值来更改另一个?

dplyr 用另一列汇总分组数据