Rac*_*wal 15 r apply dataframe
我有一个数据框:
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
Run Code Online (Sandbox Code Playgroud)
在每行中,我想计算每个值的相应比例(比率).例如,对于"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
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我这是最好的方法吗?这里只有三列,但可能有很多列.
Chi*_*til 13
以下应该做的伎俩
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
Run Code Online (Sandbox Code Playgroud)
另一种选择(虽然这主要是一个漂亮的版本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
Run Code Online (Sandbox Code Playgroud)
从帮助文件的"描述"部分?prop.table:
sweep(x, margin, margin.table(x, margin), "/")对于新手来说这是真的,除非边距为零,那么得到x/sum(x).
所以,你可以看到底层,这与@Jilber的解决方案非常相似.
而且...... R开发人员很好地考虑我们的新手,不是吗?:)
另一种替代方案 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这等效于x %>% adorn_percentages(denominator = "row"),尽管"row"是默认参数,所以在这种情况下不需要。adorn_percentages(x)如果您更喜欢没有%>%管道,则等效呼叫是。
免责声明:我创建了看门人程序包,但是觉得应该发布它;该功能的构建是为了完全执行此任务,同时使代码更易于阅读,并且可以从CRAN安装该软件包。
| 归档时间: |
|
| 查看次数: |
12865 次 |
| 最近记录: |