【问题标题】:Max of sum of combinations across columns in a dataframe数据框中各列的最大组合总和
【发布时间】:2020-09-28 17:17:26
【问题描述】:

我有数据框

df <- data.frame(e_1=c(1,2,3,4,5), e_2=c(1,3,5,7,9), e_3=c(2,4,6,8,1),
                e_4=c(1,2,4,5,7), e_5=c(1,8,9,6,4), Lanes=c(3,4,3,5,4))

我尝试使用:

max(combn(df[,(1:5)],df$Lanes,FUN = function(i) rowSums(df[,(1:5)][i])))

我得到了错误

组合错误(df[, (1:5)], df$Lanes, FUN = function(i) rowSums(df[, (1:5)][i])) : length(m) == 1L 不正确

【问题讨论】:

  • 您的示例的预期输出是什么?您在combn 中使用df$Lanes 表示m,它在这里期望一个值而不是5 的向量。您的function(i) df[, 1:5][i] 部分也将不起作用,因为每个i 都是一个数据框(您可以检查这个combn(df[, 1:5], 3, simplify = FALSE)[[1]] 这是第一个 i if m = 3) -- 你在这部分具体要做什么?
  • @rawr 我想对数据框 df 的每一行执行此操作。因此,根据combn 中的m 等于该行的Lanes 值,找到前5 列组合的最大总和。

标签: r function dataframe combinations


【解决方案1】:

我想您可以尝试按行使用combn,例如,

df$comb <- apply(df,1,function(v) max(combn(v[1:5],v["Lanes"],sum)))

这样

> df
  e_1 e_2 e_3 e_4 e_5 Lanes comb
1   1   1   2   1   1     3    4
2   2   3   4   2   8     4   17
3   3   5   6   4   9     3   20
4   4   7   8   5   6     5   30
5   5   9   1   7   4     4   25

【讨论】:

    【解决方案2】:

    对这个使用 dplyr 和 purrr 可能如下所示。

    library(dplyr)
    library(purrr)
    library(rlang)
    
    df <- data.frame(e_1=c(1,2,3,4,5), e_2=c(1,3,5,7,9), e_3=c(2,4,6,8,1),
                     e_4=c(1,2,4,5,7), e_5=c(1,8,9,6,4), Lanes=c(3,4,3,5,4))
    
    df %>%
      mutate(eSum = pmap(list(!!!parse_exprs(colnames(.))),
                         ~ max(colSums(combn(c(..1, ..2, ..3, ..4, ..5), ..6)))))
    
    #   e_1 e_2 e_3 e_4 e_5 Lanes eSum
    # 1   1   1   2   1   1     3    4
    # 2   2   3   4   2   8     4   17
    # 3   3   5   6   4   9     3   20
    # 4   4   7   8   5   6     5   30
    # 5   5   9   1   7   4     4   25
    

    【讨论】:

      【解决方案3】:

      c_across 的选项来自dplyr

      library(dplyr)
      df %>% 
          rowwise %>% 
          mutate(Comb = max(combn(c_across(starts_with('e')), Lanes, FUN = sum)))
      # A tibble: 5 x 7
      # Rowwise: 
      #    e_1   e_2   e_3   e_4   e_5 Lanes  Comb
      #  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
      #1     1     1     2     1     1     3     4
      #2     2     3     4     2     8     4    17
      #3     3     5     6     4     9     3    20
      #4     4     7     8     5     6     5    30
      #5     5     9     1     7     4     4    25
      

      【讨论】:

        猜你喜欢
        • 2016-10-10
        • 1970-01-01
        • 2021-01-14
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多