【问题标题】:r create new data frame that matches in rows elements grouped by another columnr 创建与另一列分组的行元素匹配的新数据框
【发布时间】:2018-06-01 09:09:26
【问题描述】:

我想从下面的df 创建一个新的数据框。在新的数据框 (df2) 中,df$name 中的每个元素都放在第一列,并在其行中与 df$name 的其他元素按 df$group 分组。

df <- data.frame(group = rep(letters[1:2], each=3),
                 name = LETTERS[1:6])

> df
  group name
1     a    A
2     a    B
3     a    C
4     b    D
5     b    E
6     b    F

在此示例中,df$name 中的“A”、“B”和“C”属于 df$group 中的“a”,我想将它们放在新数据框中的同一行中。所需的输出如下所示:

  > df2
          V1   V2
    1     A    B
    2     A    C
    3     B    A
    4     B    C
    5     C    A
    6     C    B
    7     D    E
    8     D    F
    9     E    D
    10    E    F
    11    F    D
    12    F    E

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们可以在 base Rmerge 中执行此操作

    out <- setNames(subset(merge(df, df, by.x = 'group', by.y = 'group'),
             name.x != name.y, select = -group), c("V1", "V2"))
    row.names(out) <- NULL
    
    out
    #   V1 V2
    #1   A  B
    #2   A  C
    #3   B  A
    #4   B  C
    #5   C  A
    #6   C  B
    #7   D  E
    #8   D  F
    #9   E  D
    #10  E  F
    #11  F  D
    #12  F  E
    

    【讨论】:

      【解决方案2】:

      在我看来,它是自加入的情况。使用dplyr 的解决方案可以是:

      library(dplyr)    
      inner_join(df, df, by="group") %>% 
        filter(name.x != name.y) %>%
        select(V1 = name.x, V2 = name.y)
      
      #    V1 V2
      # 1   A  B
      # 2   A  C
      # 3   B  A
      # 4   B  C
      # 5   C  A
      # 6   C  B
      # 7   D  E
      # 8   D  F
      # 9   E  D
      # 10  E  F
      # 11  F  D
      # 12  F  E
      

      【讨论】:

        【解决方案3】:
        df <- data.frame(group = rep(letters[1:2], each=3),
                         name = LETTERS[1:6])
        
        library(tidyverse)
        
        df %>%
          group_by(group) %>%                                      # for every group
          summarise(v = list(expand.grid(V1=name, V2=name))) %>%   # create all combinations of names
          select(v) %>%                                            # keep only the combinations
          unnest(v) %>%                                            # unnest combinations
          filter(V1 != V2)                                         # exclude rows with same names
        
        # # A tibble: 12 x 2
        #   V1    V2   
        #   <fct> <fct>
        # 1 B     A    
        # 2 C     A    
        # 3 A     B    
        # 4 C     B    
        # 5 A     C    
        # 6 B     C    
        # 7 E     D    
        # 8 F     D    
        # 9 D     E    
        # 10 F     E    
        # 11 D     F    
        # 12 E     F   
        

        【讨论】:

          猜你喜欢
          • 2021-03-28
          • 1970-01-01
          • 1970-01-01
          • 2020-12-10
          • 2019-01-22
          • 2022-07-29
          • 2019-06-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多