当前位置: 首页 > 知识库问答 >
问题:

应用group_by和总结(sum),但保留包含不相关冲突数据的列?

沈成天
2023-03-14

我的问题非常类似于在保留所有列信息的同时对数据应用group_by和摘要,但我想保留被排除的列,因为它们在分组后发生冲突。

Label <- c("203c","203c","204a","204a","204a","204a","204a","204a","204a","204a")
Type <- c("wholefish","flesh","flesh","fleshdelip","formula","formuladelip",
          "formula","formuladelip","wholefish", "wholefishdelip")
Proportion <- c(1,1,0.67714,0.67714,0.32285,0.32285,0.32285, 
                0.32285, 0.67714,0.67714)
N <- (1:10)
C <- (1:10)
Code <- c("c","a","a","b","a","b","c","d","c","d")

df <- data.frame(Label,Type, Proportion, N, C, Code)
df

   Label           Type Proportion  N  C Code
1   203c      wholefish     1.0000  1  1    c
2   203c          flesh     1.0000  2  2    a
3   204a          flesh     0.6771  3  3    a
4   204a     fleshdelip     0.6771  4  4    b
5   204a        formula     0.3228  5  5    a
6   204a   formuladelip     0.3228  6  6    b
7   204a        formula     0.3228  7  7    c
8   204a   formuladelip     0.3228  8  8    d
9   204a      wholefish     0.6771  9  9    c
10  204a wholefishdelip     0.6771 10 10    d

total <- df %>% 
  #where the Label and Code are the same the Proportion, N and C 
  #should be added together respectively
  group_by(Label, Code) %>% 
  #total proportion should add up to 1 
  #my way of checking that the correct task has been completed
  summarise_if(is.numeric, sum)

# A tibble: 6 x 5
# Groups:   Label [?]
   Label   Code Proportion     N     C
  <fctr> <fctr>      <dbl> <int> <int>
1   203c      a    1.00000     2     2
2   203c      c    1.00000     1     1
3   204a      a    0.99999     8     8
4   204a      b    0.99999    10    10
5   204a      c    0.99999    16    16
6   204a      d    0.99999    18    18

到这里为止,我得到了我想要的。现在我想包含列类型,尽管它被排除在外,因为值是冲突的。这是我想得到的结果

# A tibble: 6 x 5
# Groups:   Label [?]
   Label   Code Proportion     N     C    Type
  <fctr> <fctr>      <dbl> <int> <int>  <fctr>
1   203c      a    1.00000     2     2    wholefish
2   203c      c    1.00000     1     1    flesh
3   204a      a    0.99999     8     8    flesh_formula
4   204a      b    0.99999    10    10    fleshdelip_formuladelip
5   204a      c    0.99999    16    16    wholefish_formula
6   204a      d    0.99999    18    18    wholefishdelip_formuladelip

我已经尝试了< code>ungroup()和一些< code>mutate和< code>unite的变体,但都无济于事,任何建议都将不胜感激

共有3个答案

苏运良
2023-03-14

这是< code>data.table解决方案,我假设您需要比例的< code>mean(),因为这些分组比例可能不是相加的。

setDT(df)

df[, .(Type =paste(Type,collapse="_"), 
  Proportion=mean(Proportion),N= sum(N),C=sum(C)), by=.(Label,Code)]
  [order(Label)]

   Label Code                        Type Proportion  N  C
1:  203c    c                   wholefish   1.000000  1  1
2:  203c    a                       flesh   1.000000  2  2
3:  204a    a               flesh_formula   0.499995  8  8
4:  204a    b     fleshdelip_formuladelip   0.499995 10 10
5:  204a    c           formula_wholefish   0.499995 16 16
6:  204a    d formuladelip_wholefishdelip   0.499995 18 18

我不确定这是否是最干净的< code>dplyr解决方案,但它确实有效:

df %>% group_by(Label, Code) %>% 
  mutate(Type = paste(Type,collapse="_")) %>% 
  group_by(Label,Type,Code) %>% 
  summarise(N=sum(N),C=sum(C),Proportion=mean(Proportion))

请注意,此处的关键是在创建组合的“类型”列后重新分组。

   Label                        Type   Code     N     C Proportion
  <fctr>                       <chr> <fctr> <int> <int>      <dbl>
1   203c                       flesh      a     2     2   1.000000
2   203c                   wholefish      c     1     1   1.000000
3   204a               flesh_formula      a     8     8   0.499995
4   204a     fleshdelip_formuladelip      b    10    10   0.499995
5   204a           formula_wholefish      c    16    16   0.499995
6   204a formuladelip_wholefishdelip      d    18    18   0.499995
衡子安
2023-03-14

这里有一个tidyverse解决方案,可以保持您的group_by语句相同。关键是首先对每个变量类型(即数字、字符)使用mutate_if,然后获取不同的行。

library(tidyverse)
#> Loading tidyverse: ggplot2
#> Loading tidyverse: tibble
#> Loading tidyverse: tidyr
#> Loading tidyverse: readr
#> Loading tidyverse: purrr
#> Loading tidyverse: dplyr
#> Conflicts with tidy packages ----------------------------------------------
#> filter(): dplyr, stats
#> lag():    dplyr, stats

Label <- c("203c", "203c", "204a", "204a", "204a", "204a", "204a", "204a",
  "204a", "204a")
Type <- c("wholefish", "flesh", "flesh", "fleshdelip", "formula", "formuladelip",
  "formula", "formuladelip", "wholefish", "wholefishdelip")
Proportion <- c(1, 1, 0.67714, 0.67714, 0.32285, 0.32285, 0.32285, 0.32285,
  0.67714, 0.67714)
N <- (1:10)
C <- (1:10)
Code <- c("c", "a", "a", "b", "a", "b", "c", "d", "c", "d")

df <- data_frame(Label, Type, Proportion, N, C, Code)
df
#> # A tibble: 10 x 6
#>    Label           Type Proportion     N     C  Code
#>    <chr>          <chr>      <dbl> <int> <int> <chr>
#>  1  203c      wholefish    1.00000     1     1     c
#>  2  203c          flesh    1.00000     2     2     a
#>  3  204a          flesh    0.67714     3     3     a
#>  4  204a     fleshdelip    0.67714     4     4     b
#>  5  204a        formula    0.32285     5     5     a
#>  6  204a   formuladelip    0.32285     6     6     b
#>  7  204a        formula    0.32285     7     7     c
#>  8  204a   formuladelip    0.32285     8     8     d
#>  9  204a      wholefish    0.67714     9     9     c
#> 10  204a wholefishdelip    0.67714    10    10     d

df %>%
  group_by(Label, Code) %>%
  mutate_if(is.numeric, sum) %>%
  mutate_if(is.character, funs(paste(unique(.), collapse = "_"))) %>%
  distinct()
#> # A tibble: 6 x 6
#> # Groups:   Label, Code [6]
#>   Label                        Type Proportion     N     C  Code
#>   <chr>                       <chr>      <dbl> <int> <int> <chr>
#> 1  203c                   wholefish    1.00000     1     1     c
#> 2  203c                       flesh    1.00000     2     2     a
#> 3  204a               flesh_formula    0.99999     8     8     a
#> 4  204a     fleshdelip_formuladelip    0.99999    10    10     b
#> 5  204a           formula_wholefish    0.99999    16    16     c
#> 6  204a formuladelip_wholefishdelip    0.99999    18    18     d
宋铭
2023-03-14

以下是另外两个选项:

1) 将列嵌套到一列中,然后通过检查数据类型自定义摘要:

df %>% 
    group_by(Label, Code) %>% nest() %>% 
    mutate(data = map(data, 
        ~ as.tibble(map(.x, ~ if(is.numeric(.x)) sum(.x) else paste(.x, collapse="_")))
          )
    ) %>% unnest()

# A tibble: 6 x 6
#   Label   Code                        Type Proportion     N     C
#  <fctr> <fctr>                       <chr>      <dbl> <int> <int>
#1   203c      c                   wholefish    1.00000     1     1
#2   203c      a                       flesh    1.00000     2     2
#3   204a      a               flesh_formula    0.99999     8     8
#4   204a      b     fleshdelip_formuladelip    0.99999    10    10
#5   204a      c           formula_wholefish    0.99999    16    16
#6   204a      d formuladelip_wholefishdelip    0.99999    18    18

2)分别总结,然后加入结果:

numeric <- df %>% 
    group_by(Label, Code) %>% 
    summarise_if(is.numeric, sum)

character <- df %>% 
    group_by(Label, Code) %>% 
    summarise_if(~ is.character(.) || is.factor(.), ~ paste(., collapse="_"))

inner_join(numeric, character, by = c("Label", "Code"))
# A tibble: 6 x 6
# Groups:   Label [?]
#   Label   Code Proportion     N     C                        Type
#  <fctr> <fctr>      <dbl> <int> <int>                       <chr>
#1   203c      a    1.00000     2     2                       flesh
#2   203c      c    1.00000     1     1                   wholefish
#3   204a      a    0.99999     8     8               flesh_formula
#4   204a      b    0.99999    10    10     fleshdelip_formuladelip
#5   204a      c    0.99999    16    16           formula_wholefish
#6   204a      d    0.99999    18    18 formuladelip_wholefishdelip
 类似资料:
  • 我想按变量对数据框进行分组,汇总另一个变量,但保留所有其他关联列。 在对数据应用group_by和SUMMISE,同时保留所有列的信息时,接受的答案是使用filter()或slice(),如果答案已经存在于数据中(即min,max),则这很好,但如果您希望使用生成新答案(即sum,mean)的函数,则这不起作用。 在应用group_by和sum(sum)时,但保留包含不相关的冲突数据的列?公认的答

  • 我有一个包含22000行和25列的大型数据集。我试图根据其中一列对我的数据集进行分组,并根据分组后的数据集获取另一列的min值。但是,问题是它只给我两列,其中包含分组后的列和具有min值的列……但是我需要与具有min值的行相关的其他列的所有信息。这里有一个简单的示例,只是为了使其可重现: 因此,我还需要与列a和d相关的信息,但是,由于列c中的值存在重复,我无法基于min_value列合并它们……我

  • 本文向大家介绍MySQL中字段名和保留字冲突的解决办法,包括了MySQL中字段名和保留字冲突的解决办法的使用技巧和注意事项,需要的朋友参考一下 我们知道通常的SQL查询语句是这么写的: 这当然没问题,但如果字段名是“from”呢? 若真的这么写,必然出错,当字段名与MySQL保留字冲突时,可以用字符“`”将字段名括起来: 总结 刚发现我原先设计的数据库表里有两个字段都用了保留字(add,comme

  • 本文向大家介绍Android应用开发中数据的保存方式总结,包括了Android应用开发中数据的保存方式总结的使用技巧和注意事项,需要的朋友参考一下 一、保存文件到手机内存 二、保存文件到SD卡 获取手机sd空间的大小: 加入写外部存储的权限: 三、Sharedpreferences的使用 SharedPreference是开发中常用的一种存储方式,主要存储一些系统不变的参数如是否是第一次进入应用程

  • 问题内容: 这个问题已经在这里有了答案 : 由于在MySQL中使用保留字作为表或列名而导致的语法错误 (1个答案) 25天前关闭。 我在更新包含HTML数据的MySQL数据时遇到了问题,我不断地修复错误;但是,一旦解决了一个错误,就会产生另一个错误。当前错误如下: 我已经进行了将近3天的Stack Overflow清理工作,但没有任何明确的答案。所以我希望有人能找到这个! 这是我的PHP表单代码:

  • 关键数据结构和相关函数分析 对于第一个问题的出现,在于实验二中有关内存的数据结构和相关操作都是直接针对实际存在的资源--物理内存空间的管理,没有从一般应用程序对内存的“需求”考虑,即需要有相关的数据结构和操作来体现一般应用程序对虚拟内存的“需求”。一般应用程序的对虚拟内存的“需求”与物理内存空间的“供给”没有直接的对应关系,ucore是通过page fault异常处理来间接完成这二者之间的衔接。