我有一个数据帧:
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 /总和(X)。
所以,你可以看到下面,这实在是非常相似@ Jilber的解决方案。
而且...这是很好的用于R开发商要体谅我们的新手,是不是? :)
下面应该做的伎俩
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
用另一种方法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
功能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安装。