【问题标题】:Divide the dataframe to the sum of each row将数据框除以每一行的总和
【发布时间】:2018-01-10 12:17:35
【问题描述】:

假设我有一个数据框A(2 行,4 列):

a   b   c   d
1   2   3   4
1   3   5   4

前 2 列在第一组中,后 2 列在第二组中。我想将此df除以每组的行总和。基本上我想要这样的东西:

a     b     c     d
1/3   2/3   3/7   4/7
1/4   3/4   5/9   4/9

这只是一个玩具示例。在我的问题中,我有很多组,而不仅仅是 2 个。

【问题讨论】:

  • 您的组是如何定义的?总是每两个相邻的列吗?或者你有没有表示组的向量列表?列名中有一些模式?还有什么?

标签: r


【解决方案1】:

这是一个带有for 循环的简单方法。我假设您有每个组的列索引列表:

groups = list(c(1, 2), c(3, 4))

result = dd
for (g in groups) {
  result[g] = dd[g] / rowSums(dd[g])
}

result
#           a         b         c         d
# 1 0.3333333 0.6666667 0.4285714 0.5714286
# 2 0.2500000 0.7500000 0.5555556 0.4444444

你也可以像这样使用lapply

result2 = do.call(cbind, lapply(groups, function(g) dd[g] / rowSums(dd[g])))

使用这个输入数据:

dd = read.table(text = "a   b   c   d
1   2   3   4
1   3   5   4", header = T)

【讨论】:

    【解决方案2】:

    我的解决方案如下。我想通过识别偶数列位置(例如,2、4 和 6)来创建列对。然后,我遍历每一对并在lapply() 中处理计算。在最后一步中,我使用as.data.frame() 合并了所有结果。请注意,您的数据称为mydf

    as.data.frame(lapply(seq(from = 2, to = ncol(mydf), by = 2), function(x) {
    
                mydf[, (x-1):x] / rowSums(mydf[, (x-1):x])}
    
                ))
    
              a         b         c         d
    1 0.3333333 0.6666667 0.4285714 0.5714286
    2 0.2500000 0.7500000 0.5555556 0.4444444
    

    【讨论】:

      【解决方案3】:

      g 定义分组,使得g 中具有相同值的每一列都属于同一个组。在这里,我们将g 定义为DF 中的连续列对,但如果组有不同的大小,我们将用任何合适的定义替换它。

      对于DF 中的每一行,我们将其拆分为g,使用aveprop.table 应用于拆分的每个组件。例如,prop.table(1:2) 给出c(1/3, 2/3)。 我们将结果分配给矩阵mat。最后一行将mat 转换为数据框。如果矩阵足够,我们可以省略最后一行。

      没有使用任何包。

      g <- gl(ncol(DF)/2, 2)  # g = c(1, 1, 2, 2)
      
      mat <- t(apply(DF, 1, function(x) ave(x, g, FUN = prop.table)))
      as.data.frame(mat)
      

      给予:

      > prop
                a         b         c         d
      1 0.3333333 0.6666667 0.4285714 0.5714286
      2 0.2500000 0.7500000 0.5555556 0.4444444
      

      如果列总是成对出现,那么

      注意

      我们用这个作为输入:

      DF <- structure(list(a = c(1L, 1L), b = 2:3, c = c(3L, 5L), d = c(4L, 
      4L)), .Names = c("a", "b", "c", "d"), class = "data.frame", row.names = c(NA, 
      -2L))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-01
        • 2021-03-04
        • 2011-06-24
        • 1970-01-01
        • 2020-05-22
        相关资源
        最近更新 更多