首页 文章

计算行方式比例

提问于
浏览
14

我有一个数据框:

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

任何人都可以告诉我这是最好的方法吗?这里只有三列,但可能有很多列 .

4 回答

  • 8

    另一种选择(尽管这主要是 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 帮助文件的"description"部分:

    对于新手来说,这实际上是扫描(x,margin,margin.table(x,margin),“/”),除非如果margin的长度为零,则得到x / sum(x) .

    所以,你可以看到底层,这与@Jilber的解决方案非常相似 .

    而且...... R开发人员很好地考虑我们的新手,不是吗? :)

  • 6

    以下应该做的伎俩

    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
    
  • 11

    使用 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
    
  • 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 %>% adorn_percentages(denominator = "row") ,但 "row" 是默认参数,因此在这种情况下不需要 . 如果您不使用 %>% 管道,则等效调用为 adorn_percentages(x) .

    免责声明:我创建了看门人包,但觉得发布这个是合适的;该函数的构建是为了完成这项任务,同时使代码更清晰,并且可以从CRAN安装软件包 .

相关问题