对列进行分组并对列的子集执行函数

  • 本文关键字:子集 函数 执行 r
  • 更新时间 :
  • 英文 :


我有以下数据:

A1 <- c(1, 2, 3)
A2 <- c(2, 3, 4)
A3 <- c(3, 3, 2)
A4 <- c(2, 2, 3)
A5 <- c(4, 3, 5)
A6 <- c(6, 7, 2)
A7 <- c(1, 2, 5)
A8 <- c(2, 5, 5)
A9 <- c(2, 3, 5)
A10 <- c(7, 4, 2)
A11 <- c(7, 3, 2)
A12 <- c(9, 2, 1)
A13 <- c(1, 2, 5)
A14 <- c(2, 5, 5)
A15 <- c(2, 3, 5)
A16 <- c(7, 4, 2)
A17 <- c(7, 3, 2)
A18 <- c(9, 2, 1)
df <- cbind(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18)
> df
A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18
[1,]  1  2  3  2  4  6  1  2  2   7   7   9   1   2   2   7   7   9
[2,]  2  3  3  2  3  7  2  5  3   4   3   2   2   5   3   4   3   2
[3,]  3  4  2  3  5  2  5  5  5   2   2   1   5   5   5   2   2   1

我想将列分组为 6 组,然后在每个组中,将前 3 列除以后 3 列(即 A1/A4、A2/A5、A3/A6、A7/A10、A8/A11、A9/A12 等(,以便我最终得到包含比率的新列(见下文(。

> df_new
B1  B2        B3        B4        B5        B6        B7        B8        B9
[1,] 0.5 0.5 0.5000000 0.1428571 0.2857143 0.2222222 0.1428571 0.2857143 0.2222222
[2,] 1.0 1.0 0.4285714 0.5000000 1.6666667 1.5000000 0.5000000 1.6666667 1.5000000
[3,] 1.0 0.8 1.0000000 2.5000000 2.5000000 5.0000000 2.5000000 2.5000000 5.0000000

有没有一种快速有效的方法来做到这一点?谢谢!

我们通过创建一个带有gl的分组序列,将数据集split为 data.frame 的list,然后将前 3 列除以接下来的 3 列,cbind创建一个数据集

out <- do.call(cbind, lapply(split.default(as.data.frame(df), 
as.integer(gl(ncol(df), 6, ncol(df)))), function(x) x[1:3]/x[4:6]))
names(out) <- paste0("B", seq_along(out))
out
#   B1  B2        B3        B4        B5        B6        B7        B8        B9
#1 0.5 0.5 0.5000000 0.1428571 0.2857143 0.2222222 0.1428571 0.2857143 0.2222222
#2 1.0 1.0 0.4285714 0.5000000 1.6666667 1.5000000 0.5000000 1.6666667 1.5000000
#3 1.0 0.8 1.0000000 2.5000000 2.5000000 5.0000000 2.5000000 2.5000000 5.0000000

另一种选择是使用逻辑向量(回收(对数据集进行子集化,然后执行/

i1 <- rep(c(TRUE, FALSE), each = 3)
out2 <- df[,i1]/df[,!i1]
colnames(out2) <- paste0("B", seq_len(ncol(out2)))
out2
#      B1  B2        B3        B4        B5        B6        B7        B8
#[1,] 0.5 0.5 0.5000000 0.1428571 0.2857143 0.2222222 0.1428571 0.2857143
#[2,] 1.0 1.0 0.4285714 0.5000000 1.6666667 1.5000000 0.5000000 1.6666667
#[3,] 1.0 0.8 1.0000000 2.5000000 2.5000000 5.0000000 2.5000000 2.5000000
#            B9
#[1,] 0.2222222
#[2,] 1.5000000
#[3,] 5.0000000

注意:与拆分相比,这应该更有效

最新更新