【问题标题】:How to create a new column in a dataframe based on grouped permutations of another column如何根据另一列的分组排列在数据框中创建新列
【发布时间】:2018-04-13 20:57:04
【问题描述】:

我有一个这样的数据框:

df <- data.frame(grouping = c(rep("site1_1",9), rep("site2_1",9)),
                 var = c(rep("P", 3), rep("G", 3), rep("B",3),rep("P", 3), rep("B", 3), rep("G",3)),
                 order= c(rep(0, 3), rep(1, 3), rep(2,3),rep(0, 3), rep(1, 3), rep(2,3)))

   grouping var order
1   site1_1   P     0
2   site1_1   P     0
3   site1_1   P     0
4   site1_1   G     1
5   site1_1   G     1
6   site1_1   G     1
7   site1_1   B     2
8   site1_1   B     2
9   site1_1   B     2
10  site2_1   P     0
11  site2_1   P     0
12  site2_1   P     0
13  site2_1   B     1
14  site2_1   B     1
15  site2_1   B     1
16  site2_1   G     2
17  site2_1   G     2
18  site2_1   G     2

我有一列表示一个名为 Grouping 的唯一 ID(从不重复)。在每个分组中,我有 3 个变量(P、G 和 B)。如上所示,它们确实在一个分组中重复多次。

顺序始终为 P,G,B 或 P,B,G。在一个组内 P 总是 0,B/G 要么是 1 要么是 2。它们在一个组内永远不可能是 1 和 2,而在组之间,B 或 G 是 1 还是 2 是随机的。

我有一个 order 列来显示 var 在每个组中的顺序

我想添加一个新列,根据 B 是否在 G 之前或反之亦然来标记整个分组(P、B 和 G)。

这是一个示例:

   grouping var order  label
1   site1_1   P     0 Gfirst
2   site1_1   P     0 Gfirst
3   site1_1   P     0 Gfirst
4   site1_1   G     1 Gfirst
5   site1_1   G     1 Gfirst
6   site1_1   G     1 Gfirst
7   site1_1   B     2 Gfirst
8   site1_1   B     2 Gfirst
9   site1_1   B     2 Gfirst
10  site2_1   P     0 Bfirst
11  site2_1   P     0 Bfirst
12  site2_1   P     0 Bfirst
13  site2_1   B     1 Bfirst
14  site2_1   B     1 Bfirst
15  site2_1   B     1 Bfirst
16  site2_1   G     2 Bfirst
17  site2_1   G     2 Bfirst
18  site2_1   G     2 Bfirst

我不清楚如何做到这一点。

使用 dplyr 我开始

df %>% group_by(分组) %>% mutate(label = .......

但是在这里之后,我不知道如何指定标签以 P、B 和 G 的顺序为条件,以及如何解释它们在每个组中重复多次的事实。

我参加了这个交流:

[How can I create a new column in a dataframe based on permutations of other columns?

但我不清楚如何采用答案,因为我需要按分组列对它们进行分组,并且需要考虑每个变量内不同数量的排列(可以有 3-15 个 P、B 和 G 的范围在每个分组中。

非常感谢任何帮助。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:
    library(tidyverse)
    
    df %>% 
      group_by(grouping) %>% 
      mutate(label = paste0(substr(gsub("[^G|B]", "", paste(unique(var), collapse = "")), 1, 1), "first"))
    

    【讨论】:

      【解决方案2】:

      使用dplyrifelse 的解决方案可以实现为:

      library(dplyr)
      
      df %>% group_by(grouping) %>%
        mutate(label = ifelse(var[var!="P"][1] == "B","BFirst","GFirst" )) %>%
        as.data.frame()
      
      #    grouping var order  label
      # 1   site1_1   P     0 GFirst
      # 2   site1_1   P     0 GFirst
      # 3   site1_1   P     0 GFirst
      # 4   site1_1   G     1 GFirst
      # 5   site1_1   G     1 GFirst
      # 6   site1_1   G     1 GFirst
      # 7   site1_1   B     2 GFirst
      # 8   site1_1   B     2 GFirst
      # 9   site1_1   B     2 GFirst
      # 10  site2_1   P     0 BFirst
      # 11  site2_1   P     0 BFirst
      # 12  site2_1   P     0 BFirst
      # 13  site2_1   B     1 BFirst
      # 14  site2_1   B     1 BFirst
      # 15  site2_1   B     1 BFirst
      # 16  site2_1   G     2 BFirst
      # 17  site2_1   G     2 BFirst
      # 18  site2_1   G     2 BFirst
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-30
        • 2021-11-10
        • 2018-03-14
        • 1970-01-01
        • 2022-10-15
        • 2021-12-02
        • 2017-04-02
        • 1970-01-01
        相关资源
        最近更新 更多