在列的子集上对列进行分组和执行函数

时间:2018-05-29 16:10:48

标签: 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

有快速有效的方法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我们通过创建split的分组序列,将数据集list导入gl data.frame,然后将前3列除以下3列{{1}创建单个数据集

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

/

注意:与分割

相比,这应该更有效