R 按行计算比例
我有一个数据框:R 按行计算比例,r,dataframe,apply,R,Dataframe,Apply,我有一个数据框: 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 谁能告诉我最好的方法是什么?这里只有三列,但可以有很多列。下面应该可以做到这一点 cbind(id = x[, 1], x[, -1]/rowSums(x[
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
谁能告诉我最好的方法是什么?这里只有三列,但可以有很多列。下面应该可以做到这一点
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
还有另一种选择(尽管这是一个相当不错的扫描版本)<代码>道具表
:
> 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
从帮助文件的“说明”部分(位于?道具表)
:
> 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
对于新手来说,这实际上是sweep(x,margin,margin.table(x,margin),“/”
,除了如果margin的长度为零,那么就得到x/sum(x)
所以,你可以看到下面,这与@Jilber的解决方案非常相似
而且。。。R开发人员能体谅我们这些新手是件好事,不是吗?:) 看门人软件包中的函数
装饰百分比()
执行以下操作:
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\u百分比(分母=“行”)
,尽管“行”
是默认参数,因此在这种情况下不需要。如果您希望在不使用%%>%
管道的情况下调用,则等效调用是装饰百分比(x)
免责声明:我创建了“看门人”软件包,但觉得发布该软件包是合适的;该函数的构建目的是在使代码更清晰易读的同时准确执行此任务,并且该软件包可以从CRAN安装。@Jilber,谢谢。实际上,它是受您的解决方案启发而来的,因为我总是记得
prop.table
的描述,首先说它是sweep
,适合新手使用(我一直都是这样)。使用cbind
:x[-1]