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]