【问题标题】:Summing all combinations of a column based on another column in R基于R中的另一列对列的所有组合求和
【发布时间】:2020-10-21 10:31:53
【问题描述】:

我在 R 中有以下示例数据框:

Var1 = c("Shirt1", "Shirt2", "Shirt3", "Shirt4", "Pants1", "Pants2", "Pants3", "Jacket1", "Jacket2", "Jacket3")
Var2 = c(1,4,3,4,6,5,2,3,6,2)
Bin = c("A", "A", "A", "A", "B", "B", "B", "C", "C", "C")
MyData = data.frame(Var1, Var2, Bin)

看起来像这样:

    Var1     Var2 Bin
1   Shirt1   1    A
2   Shirt2   4    A
3   Shirt3   3    A
4   Shirt4   4    A
5   Pants1   6    B
6   Pants2   5    B
7   Pants3   2    B
8  Jacket1   3    C
9  Jacket2   6    C
10 Jacket3   2    C

所以有 3 个 bin,每个 bin 中有可变数量的 Var1 条目。请注意,此数据框中还有更多行(和箱),但在这里进行了简化。组合由来自每个 bin 的 Var1 的一个条目组成。我想在所有 bin 中找到 Var1 的所有可能组合,然后为组合求和 Var2。输出看起来像这样:

Bin A   Bin B   Bin C     Sum
Shirt1  Pants1  Jacket1   10
Shirt2  Pants1  Jacket1   13
Shirt2  Pants2  Jacket1   12
Shirt3  Pants1  Jacket2   15
Etc.

虽然我看到了一些类似的线程,但这个问题似乎足够独特,至少基于我对 R 的熟练程度。

非常感谢任何建议,谢谢!

【问题讨论】:

    标签: r dataframe combinations


    【解决方案1】:

    我们可以创建一个包含所有可能组合的数据框

    temp <- do.call(expand.grid, split(MyData$Var1, MyData$Bin))
    temp 
    #        A      B       C
    #1  Shirt1 Pants1 Jacket1
    #2  Shirt2 Pants1 Jacket1
    #3  Shirt3 Pants1 Jacket1
    #4  Shirt4 Pants1 Jacket1
    #5  Shirt1 Pants2 Jacket1
    #6  Shirt2 Pants2 Jacket1
    #....
    

    然后为每一行子集相关数据和sumVar2 值。

    temp$Sum <- apply(temp, 1, function(x) sum(MyData$Var2[MyData$Var1 %in% x]))
    temp
    #        A      B       C Sum
    #1  Shirt1 Pants1 Jacket1  10
    #2  Shirt2 Pants1 Jacket1  13
    #3  Shirt3 Pants1 Jacket1  12
    #4  Shirt4 Pants1 Jacket1  13
    #5  Shirt1 Pants2 Jacket1   9
    #6  Shirt2 Pants2 Jacket1  12
    #....
    

    【讨论】:

    • 非常感谢,非常有帮助。一个后续问题,有没有办法做同样的事情但不包括垃圾箱?比如只有 Shirt1 和 Pants1、Pants2 和 Jacket1 等两个 bin 的组合?在上面的示例中,它基本上会为每个可能的两个 bin 组合和三个 bin 组合创建输出。
    • @jport 您可以先对要保留的 bin 进行数据子集化。 MyData &lt;- subset(MyData, Bin %in% c('A', 'B')) 然后用上面的?
    【解决方案2】:

    您可以按如下方式使用rowsum

    a <- expand.grid(split(MyData$Var1, MyData$Bin))
    
    cbind(a, Sum = rowsum(MyData$Var2[unlist(a)], c(row(a))))
    
            A      B       C Sum
    1  Shirt1 Pants1 Jacket1  10
    2  Shirt2 Pants1 Jacket1  13
    3  Shirt3 Pants1 Jacket1  12
    4  Shirt4 Pants1 Jacket1  13
    5  Shirt1 Pants2 Jacket1   9
    ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-27
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      相关资源
      最近更新 更多