R帮助:将值除以通过因子产生的总和
R help: divide values by sum produced through factor
由于 A 列中的一个因素,我试图将 B 列和 C 列中的每个值除以总和。
起始矩阵可能看起来像这样但有数千行
其中 A 是一个因子,B 和 C 包含值:
A <- c(1,1,2,2)
B <- c(0.2, 0.3, 1, 0.5)
C <- c(0.7, 0.5, 0, 0.9)
M <- data.table(A,B,C)
> M
A B C
[1,] 1 0.2 0.7
[2,] 1 0.3 0.5
[3,] 2 1.0 0.0
[4,] 2 0.5 0.9
这些因素可以出现任意次数。
我能够使用库 data.table 生成每个因子的总和:
library(data.table)
M.dt <- data.table(M)
M.sum <- M.dt[, lapply(.SD, sum), by = A]
> M.sum
A B C
1: 1 0.5 1.2
2: 2 1.5 0.9
但不知道如何从这里继续保持 table 的原始格式。
结果 table 应该如下所示:
B.1 <- c(0.4, 0.6, 0.666, 0.333)
C.1 <- c(0.583, 0.416, 0, 1)
M.1 <- cbind(A, B.1, C.1)
> M.1
A B.1 C.1
[1,] 1 0.400 0.58333
[2,] 1 0.600 0.41666
[3,] 2 0.666 0.00000
[4,] 2 0.333 1.00000
B.1 中第一个值的计算如下:
0.2/(0.2+0.3) = 0.4 等等,其中要添加的值由 A.
中的因子给出
我对 R 有一些基础知识,但尽管很努力,但我在矩阵操作和循环方面做得很糟糕。
只需将每列中的每个值除以 sum
每个 A
中的值
M[, lapply(.SD, function(x) x/sum(x)), A]
# A B C
# 1: 1 0.4000000 0.5833333
# 2: 1 0.6000000 0.4166667
# 3: 2 0.6666667 0.0000000
# 4: 2 0.3333333 1.0000000
如果你想通过引用更新
M[, c("B", "C") := lapply(.SD, function(x) x/sum(x)), A]
或更一般地说
M[, names(M)[-1] := lapply(.SD, function(x) x/sum(x)), A]
dplyr
瘾君子的奖励解决方案
library(dplyr)
M %>%
group_by(A) %>%
mutate_each(funs(./sum(.)))
# Source: local data table [4 x 3]
# Groups: A
#
# A B C
# 1 1 0.4000000 0.5833333
# 2 1 0.6000000 0.4166667
# 3 2 0.6666667 0.0000000
# 4 2 0.3333333 1.0000000
像大多数此类问题一样,您可以使用 data.table
或 plyr
程序包,或者在基础 R 中组合拆分、应用、组合函数。
对于那些喜欢 plyr
套餐的人
library (plyr)
M <- data.table(A,B,C)
ddply(M, .(A), colwise(function(x) x/sum(x)))
输出为:
A B C
1 1 0.4000000 0.5833333
2 1 0.6000000 0.4166667
3 2 0.6666667 0.0000000
4 2 0.3333333 1.0000000
由于 A 列中的一个因素,我试图将 B 列和 C 列中的每个值除以总和。 起始矩阵可能看起来像这样但有数千行 其中 A 是一个因子,B 和 C 包含值:
A <- c(1,1,2,2)
B <- c(0.2, 0.3, 1, 0.5)
C <- c(0.7, 0.5, 0, 0.9)
M <- data.table(A,B,C)
> M
A B C
[1,] 1 0.2 0.7
[2,] 1 0.3 0.5
[3,] 2 1.0 0.0
[4,] 2 0.5 0.9
这些因素可以出现任意次数。 我能够使用库 data.table 生成每个因子的总和:
library(data.table)
M.dt <- data.table(M)
M.sum <- M.dt[, lapply(.SD, sum), by = A]
> M.sum
A B C
1: 1 0.5 1.2
2: 2 1.5 0.9
但不知道如何从这里继续保持 table 的原始格式。
结果 table 应该如下所示:
B.1 <- c(0.4, 0.6, 0.666, 0.333)
C.1 <- c(0.583, 0.416, 0, 1)
M.1 <- cbind(A, B.1, C.1)
> M.1
A B.1 C.1
[1,] 1 0.400 0.58333
[2,] 1 0.600 0.41666
[3,] 2 0.666 0.00000
[4,] 2 0.333 1.00000
B.1 中第一个值的计算如下:
0.2/(0.2+0.3) = 0.4 等等,其中要添加的值由 A.
中的因子给出
我对 R 有一些基础知识,但尽管很努力,但我在矩阵操作和循环方面做得很糟糕。
只需将每列中的每个值除以 sum
每个 A
M[, lapply(.SD, function(x) x/sum(x)), A]
# A B C
# 1: 1 0.4000000 0.5833333
# 2: 1 0.6000000 0.4166667
# 3: 2 0.6666667 0.0000000
# 4: 2 0.3333333 1.0000000
如果你想通过引用更新
M[, c("B", "C") := lapply(.SD, function(x) x/sum(x)), A]
或更一般地说
M[, names(M)[-1] := lapply(.SD, function(x) x/sum(x)), A]
dplyr
瘾君子的奖励解决方案
library(dplyr)
M %>%
group_by(A) %>%
mutate_each(funs(./sum(.)))
# Source: local data table [4 x 3]
# Groups: A
#
# A B C
# 1 1 0.4000000 0.5833333
# 2 1 0.6000000 0.4166667
# 3 2 0.6666667 0.0000000
# 4 2 0.3333333 1.0000000
像大多数此类问题一样,您可以使用 data.table
或 plyr
程序包,或者在基础 R 中组合拆分、应用、组合函数。
对于那些喜欢 plyr
套餐的人
library (plyr)
M <- data.table(A,B,C)
ddply(M, .(A), colwise(function(x) x/sum(x)))
输出为:
A B C
1 1 0.4000000 0.5833333
2 1 0.6000000 0.4166667
3 2 0.6666667 0.0000000
4 2 0.3333333 1.0000000