我有一个数据框:

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


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

最佳答案

还有另一种选择(尽管这主要是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开发人员能够体贴我们的新手,不是吗? :)

10-08 00:31