【问题标题】:R apply a sum on dataset values according to all possible combination of character columnR根据字符列的所有可能组合对数据集值应用总和
【发布时间】:2022-07-08 18:37:11
【问题描述】:

我有一个看起来像这样的数据集

data.frame(A = c("a","b","c","d"),B= c(1,2,3,4))
OUTPUT
A  B
a  1
b  2
c  3
d  4

例如,我想根据 A 列中 2 个元素的可能组合,得到一个新的数据框,其中包含 B 列中元素的总和

comb_A sum_B
a b    3
b c    5
c d    7 
a d    5
excetera... 

我是 r 新手,有什么方法可以做到这一点吗?提前谢谢你

【问题讨论】:

    标签: r dataframe combinations


    【解决方案1】:

    您可以尝试在基地R

    df1 <- as.data.frame(t(combn(df$A, 2)))
    
    data.frame(comb_A = paste(df1$V1, df1$V2), comb_B = df$B[match(df1$V1, df$A)] + df$B[match(df1$V2, df$A)])
    
      comb_A comb_B
    1    a b      3
    2    a c      4
    3    a d      5
    4    b c      5
    5    b d      6
    6    c d      7
    

    【讨论】:

      【解决方案2】:

      base R 中的可能解决方案:

      result <- data.frame(
        expand.grid(comb_B = df$A, comb_A = df$A)[2:1], 
        sum = c(outer(df$B, df$B, \(x,y) x+y))
      )
      
      result <- result[result$comb_A != result$comb_B,]
      
      result
      
      #>    comb_A comb_B sum
      #> 2       a      b   3
      #> 3       a      c   4
      #> 4       a      d   5
      #> 5       b      a   3
      #> 7       b      c   5
      #> 8       b      d   6
      #> 9       c      a   4
      #> 10      c      b   5
      #> 12      c      d   7
      #> 13      d      a   5
      #> 14      d      b   6
      #> 15      d      c   7
      

      【讨论】:

        【解决方案3】:

        这是一种(尽管很混乱)的方法。

        library(tidyverse)
        
        df <- data.frame(A = c("a","b","c","d"),B= c(1,2,3,4))
        df %>% 
          expand(A, A) %>% 
          unite("comb_A", starts_with("A"), sep = " ") %>% 
          mutate(sum_B = map_dbl(
            str_split(comb_A, " "),
            ~sum(df$B[match(.x, df$A)])
          ))
        #> # A tibble: 16 × 2
        #>    comb_A sum_B
        #>    <chr>  <dbl>
        #>  1 a a        2
        #>  2 a b        3
        #>  3 a c        4
        #>  4 a d        5
        #>  5 b a        3
        #>  6 b b        4
        #>  7 b c        5
        #>  8 b d        6
        #>  9 c a        4
        #> 10 c b        5
        #> 11 c c        6
        #> 12 c d        7
        #> 13 d a        5
        #> 14 d b        6
        #> 15 d c        7
        #> 16 d d        8
        

        【讨论】:

          【解决方案4】:

          我们可以像下面这样使用combn

          with(
            df,
            data.frame(
              comb_A = combn(A, 2, list),
              sum_B = combn(B, 2, sum)
            )
          )
          

          给了

            comb_A sum_B
          1   a, b     3
          2   a, c     4
          3   a, d     5
          4   b, c     5
          5   b, d     6
          6   c, d     7
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多