计算逐行比例(Calculate row-wise proportions)

2019-08-31 07:11发布

我有一个数据帧:

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

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

Answer 1:

而另一种选择(虽然这是主要是一个漂亮的版本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 /总和(X)。

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

而且...这是很好的用于R开发商要体谅我们的新手,是不是? :)



Answer 2:

下面应该做的伎俩

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


Answer 3:

用另一种方法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


Answer 4:

功能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安装。



文章来源: Calculate row-wise proportions