我有一个数据框:
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开发人员能够体贴我们的新手,不是吗? :)