【问题标题】:Calculate row-wise proportions计算逐行比例
【发布时间】:2013-04-08 14:37:00
【问题描述】:

我有一个数据框:

x <- data.frame(id = letters[1:3], val0 = 1:3, val1 = 4:6, val2 = 7:9)
#   id val0 val1 val2
# 1  a    1    4    7
# 2  b    2    5    8
# 3  c    3    6    9

在每一行中,我想计算每个值对应的比例(比率)。例如。对于“val0”列中的值,我想逐行计算 val0 / (val0 + val1 + val2)。

期望的输出:

  id     val0  val1   val2
1  a    0.083  0.33   0.583
2  b    0.133  0.33   0.533
3  c    0.167  0.33   0.5

谁能告诉我最好的方法是什么?这里只有三列,但可以有很多列。

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    以下应该可以解决问题

    cbind(id = x[, 1], x[, -1]/rowSums(x[, -1]))
    ##   id       val0      val1      val2
    ## 1  a 0.08333333 0.3333333 0.5833333
    ## 2  b 0.13333333 0.3333333 0.5333333
    ## 3  c 0.16666667 0.3333333 0.5000000
    

    【讨论】:

    • 使用cbind的替代方法:x[-1] &lt;- x[-1] / rowSums(x[-1])
    【解决方案2】:

    使用sweep的另一种选择

    sweep(x[,-1], 1, rowSums(x[,-1]), FUN="/")
            val0      val1      val2
    1 0.08333333 0.3333333 0.5833333
    2 0.13333333 0.3333333 0.5333333
    3 0.16666667 0.3333333 0.5000000
    

    【讨论】:

      【解决方案3】:

      还有另一种选择(虽然这主要是sweep 的漂亮版本)...prop.table

      > cbind(x[1], prop.table(as.matrix(x[-1]), margin = 1))
        id       val0      val1      val2
      1  a 0.08333333 0.3333333 0.5833333
      2  b 0.13333333 0.3333333 0.5333333
      3  c 0.16666667 0.3333333 0.5000000
      

      来自?prop.table的帮助文件的“描述”部分:

      这对于新手来说真的是sweep(x, margin, margin.table(x, margin), "/"),除了如果边距的长度为零,那么一个得到x/sum(x)。

      所以,您可以在下面看到,这与@Jilber 的解决方案非常相似。

      而且... R 开发人员能够体谅我们这些新手是件好事,不是吗? :)

      【讨论】:

      • @Jilber,谢谢。实际上,它受到了您的解决方案的启发,因为我总是记得 prop.table 的描述以说它是新手的 sweep(我永远是)。
      【解决方案4】:

      janitor 包中的函数adorn_percentages() 执行此操作:

      library(janitor)
      x %>% adorn_percentages()
       id       val0      val1      val2
        a 0.08333333 0.3333333 0.5833333
        b 0.13333333 0.3333333 0.5333333
        c 0.16666667 0.3333333 0.5000000
      

      这等效于x %&gt;% adorn_percentages(denominator = "row"),尽管"row" 是默认参数,因此在这种情况下不需要。如果您更喜欢不使用 %&gt;% 管道,则等效调用是 adorn_percentages(x)

      免责声明:我创建了 janitor 包,但觉得发布此内容是合适的;该函数旨在执行此任务,同时使代码更清晰易读,并且可以从 CRAN 安装包。

      【讨论】:

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