Группировка столбцов и выполнение функций на подмножествах столбцов - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующие данные:

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 (т.е.А1 / А4, А2 / А5, А3 / А6, А7 / А10, А8 / А11, А9 / А12 и т. Д.), Чтобы я получил новые столбцы с соотношениями (см. Ниже).

> 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 голосов
/ 29 мая 2018

Мы split набор данных в list data.frame, создав последовательность группировки с gl, затем разделить первые 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

ПРИМЕЧАНИЕ. Это должно быть более эффективным по сравнению с разбиением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...