我有以下数据:
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
有快速有效的方法吗?谢谢!
答案 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
/
注意:与分割
相比,这应该更有效