代码之家  ›  专栏  ›  技术社区  ›  anderwyang

如何通过以智能方式总结包含“\u sales”的给定列来创建新列?

  •  0
  • anderwyang  · 技术社区  · 4 年前

    如何通过使用包含“_sales”的给定列汇总来创建新列?

    代码如下:结果如下: md %>% rowwise()%>% mutate(sub_total=across(contains("_sales"),sum)) 这不是我想要的。 md$sub_total <- md$a_sales+md$b_sales+md$d_sales 可以工作,但当给定的列多于当前列时会有点复杂

    ori_data <- data.frame(a_sales=c(1:5),
                     tsalses=c(1:5),
                     b_sales=c(7:11),
                     d_sales=c(1:5))
    
    # this can't work
    md %>% rowwise()%>% mutate(sub_total=across(contains("_sales"),sum))
    
    # this can work, but the code is little boring
    md$sub_total <- md$a_sales+md$b_sales+md$d_sales
    
    2 回复  |  直到 4 年前
        1
  •  2
  •   koolmees    4 年前

    问题在于您如何跨平台使用。现在您要说的是,对于包含“\u sales”的每一列,您都要求和。实际上,您需要将这些列相加。

    而不是使用 rowwise() sum() 我们可以简单地使用 rowSums() :

    ori_data %>% 
      mutate(sub_total = rowSums(across(contains("_sales"))))
    
        2
  •  0
  •   Limey    4 年前

    在这种情况下,tidyverse函数不容易使用的一个原因是您的数据帧不容易使用,这也是正确的 tidy -因为您的列名包含您需要在摘要中使用的信息。

    要使数据整洁,您需要调整数据以使其更长。然后tidyverse函数变得更易于使用。这里有一些代码可以整理您的数据,并在一个步骤中计算您的子_总数。

    md %>% 
      full_join(
        md %>% 
          pivot_longer(ends_with("_sales"), names_to="Variable", values_to="Value") %>% 
          group_by(tsalses) %>% 
          summarise(sub_total=sum(Value), .groups="drop"),
        by="tsalses"
      )
      a_sales tsalses b_sales d_sales sub_total
    1       1       1       7       1         9
    2       2       2       8       2        12
    3       3       3       9       3        15
    4       4       4      10       4        18
    5       5       5      11       5        21