20

我有一个数据框:

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

谁能告诉我最好的方法是什么?这里只有三列,但可以有很多列。

4

4 回答 4

16

以下应该可以解决问题

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
于 2013-04-16T09:06:37.013 回答
14

还有另一种选择(尽管这主要是一个漂亮的版本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 开发人员能够体谅我们这些新手真是太好了,不是吗?:)

于 2013-04-16T10:16:17.120 回答
9

另一种选择使用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
于 2013-04-16T09:19:21.820 回答
7

adorn_percentages()janitor 包中的函数执行以下操作:

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)如果您更喜欢不使用%>%管道,则等效调用是。

免责声明:我创建了 janitor 包,但觉得发布这个是合适的;该功能旨在执行此任务,同时使代码更清晰易读,并且可以从 CRAN 安装包。

于 2016-10-13T20:36:53.723 回答