Несколько рядов * рядов - PullRequest
       19

Несколько рядов * рядов

0 голосов
/ 30 января 2019

У меня установлен пример данных, как показано ниже

variable=c("i","x1","x2","x3","v1","v2","v3","g1","g2","g3")
df=data.frame(replicate(10,sample(0:100,10,rep=TRUE)))
df$var=variable
df
  X1 X2 X3  X4 X5 X6  X7 X8 X9 X10 var
1  48  0 65  16 40 85  43 74 25  17   i
2  29 74 19  11 34 65  94 72 10  75  x1
3  21 66 78   4 76 86  85 59 17  27  x2
4  19 87 55 100 51 38  33 63 94  10  x3
5  67 37 86  69 50 90  98 22 18  46  v1
6  67 47 28  82 96 66 100 57 99  47  v2
7  82  5 38  27 14 87  36  9  9  86  v3
8  66  6 18  43 24 96  94 95 79   0  g1
9  52 79 69  82 89 58  46 28 30   8  g2
10  0 49 24  16 79 86  53 86 23  51  g3

Здесь столбец var является ключевым.Что я хочу сделать, это создать таблицу, где каждая строка представляет комбинации I, Xs, Vs, Gs.например, одна строка будет

var_comb            X1      X2  .................X10              
"i,x1,v1,g1"       6155424
"i,x1,v1,g2"       4849728

значение X1 есть (48 * 29 * 67 * 66), т.е. значения из исходной таблицы аналогичны второй комбинации (48 * 29 * 67 * 52)

Таким образом, есть 3 * 3 * 3 = 27 строк комбинаций.Как я генерирую желаемый результат?

Обратите внимание, что x, v и g похожи на разные переменные, 1,2,3 - их уровни.Их не нужно умножать друг на друга (то есть комбинации типа «i, x1, x2, v1»), но друг с другом - каждый уникальный уровень x с уникальным уровнем v и g)

1 Ответ

0 голосов
/ 30 января 2019

Вот решение с data.table:

library("data.table")
D <- fread(
"  X1 X2 X3  X4 X5 X6  X7 X8 X9 X10 var
48  0 65  16 40 85  43 74 25  17   i
29 74 19  11 34 65  94 72 10  75  x1
21 66 78   4 76 86  85 59 17  27  x2
19 87 55 100 51 38  33 63 94  10  x3
67 37 86  69 50 90  98 22 18  46  v1
67 47 28  82 96 66 100 57 99  47  v2
82  5 38  27 14 87  36  9  9  86  v3
66  6 18  43 24 96  94 95 79   0  g1
52 79 69  82 89 58  46 28 30   8  g2
0 49 24  16 79 86  53 86 23  51  g3"
)

var_comb <- c("i,x1,v1,g1", "i,x1,v1,g2")

L <- strsplit(var_comb, ",")

myfun <- function(Rows) {
  sapply(D[var %in% Rows, -11], prod)
}
sapply(L, myfun)
data.table(var_comb, t(sapply(L, myfun)))

Функция myfun() принимает вектор символов указателей строки.D[var %in% Rows, -11] выбирает строки с использованием вектора логического индекса и игнорирует 11-й столбец.sapply(..., prod) вычисляет произведение для каждого столбца.
Чтобы сгенерировать все комбинации для var_comb, выполните:

expand.grid("i", paste0("x", 1:3), paste0("v", 1:3), paste0("g", 1:3))

Таким образом, вы можете собрать его вместе:

Var_Comb <- expand.grid("i", paste0("x", 1:3), paste0("v", 1:3), paste0("g", 1:3))
apply(Var_Comb, 1, myfun)
var_comb <- apply(Var_Comb, 1, paste0, collapse=',')
data.table(var_comb, t(apply(Var_Comb, 1, myfun)))

дляоснование R:

setDF(D)  ## only needed for using the data.table D from above

var_comb <- c("i,x1,v1,g1", "i,x1,v1,g2")

L <- strsplit(var_comb, ",")

myfun <- function(Rows) {
  sapply(D[D$var %in% Rows, -11], prod)
}
sapply(L, myfun)
data.frame(var_comb, t(sapply(L, myfun)))

и (аналогично варианту data.table):

Var_Comb <- expand.grid("i", paste0("x", 1:3), paste0("v", 1:3), paste0("g", 1:3))
apply(Var_Comb, 1, myfun)
var_comb <- apply(Var_Comb, 1, paste0, collapse=',')
data.table(var_comb, t(apply(Var_Comb, 1, myfun)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...