Разделите информационный кадр на все возможные комбинации информационных кадров на 3 столбца в R - PullRequest
0 голосов
/ 31 мая 2018

Мне нужно получить все возможные кадры данных из разбиения исходного кадра данных на все возможные комбинации из 3 столбцов.И все данные должны содержать столбец id.Я зашел в тупик и не знаю, как сохранить все возможные кадры данных, чтобы в дальнейшем можно было работать со всеми из них.Одна из идей - сохранить их в списке.Но все же я не знаю, как связать все необходимые столбцы вместе.Я нашел близкий вопрос к моему, но он все еще сильно отличается.Кроме того, исходный фрейм данных содержит более 1 млн строк и около 20 столбцов, поэтому целесообразно использовать data.table.

frame <- data.frame(id = letters[seq( from = 1, to = 10 )], 
                    a = rnorm(10, 4), b = rnorm(10, 6), c=rnorm(10, 5),
                    d = rnorm(10, 2))

combos <- data.table(combn(colnames(frame[,-1]), 3))
combos <- data.table(t(rbind(combos, t(rep(colnames(output2[,1]), ncol(combos))))))
names(combos) <- c('category_1', 'category_2', 'category_3', 'id')

list_tables <- apply(combos, 1, as.list)

Ребята, буду признателен за любую помощь.Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Я бы рекомендовал , а не , генерируя все данные в виде списка.Просто сгенерируйте матрицу комбинаций имен столбцов (например, что вы делаете) и используйте их по одному:

combos = combn(colnames(frame[,-1]), 3)
combos = rbind("id", combos)

Затем вы просто используете i-й столбец combosв подмножество frame по требованию.

# first combo
frame[combos[, 1]]
# hundred and third combo
frame[combos[, 103]]
# etc.

Будет хорошо, если frame будет data.table, но сохранение combos в качестве матрицы будет проще и эффективнее.

0 голосов
/ 31 мая 2018

Пожалуйста, смотрите комментарии к вашему образцу данных и ожидаемый результат.Помимо этого, возможно, вы можете сделать что-то вроде этого?

lapply(as.data.frame(combn(ncol(frame) - 1, 3)), function(idx)
    frame[, c(1, idx + 1)])
#$V1
#   id        a        b        c
#1   a 5.434201 6.342768 5.140709
#2   b 3.922708 7.572425 4.147767
#3   c 4.739137 5.253265 6.903397
#4   d 2.241395 6.306650 3.351814
#5   e 3.930175 4.569514 5.759625
#6   f 4.451906 7.194427 5.062291
#7   g 2.041634 5.517932 4.610969
#8   h 3.998476 7.317862 5.636666
#9   i 3.734664 4.870168 4.132215
#10  j 5.563223 5.073649 5.098734
#
#$V2
#   id        a        b         d
#1   a 5.434201 6.342768 1.3168256
#2   b 3.922708 7.572425 2.2410894
#3   c 4.739137 5.253265 2.5894319
#4   d 2.241395 6.306650 1.0693751
#5   e 3.930175 4.569514 2.2974619
#6   f 4.451906 7.194427 5.1372771
#7   g 2.041634 5.517932 0.9724653
#8   h 3.998476 7.317862 3.9418028
#9   i 3.734664 4.870168 1.7220438
#10  j 5.563223 5.073649 1.7784112
#
#$V3
#   id        a        c         d
#1   a 5.434201 5.140709 1.3168256
#2   b 3.922708 4.147767 2.2410894
#3   c 4.739137 6.903397 2.5894319
#4   d 2.241395 3.351814 1.0693751
#5   e 3.930175 5.759625 2.2974619
#6   f 4.451906 5.062291 5.1372771
#7   g 2.041634 4.610969 0.9724653
#8   h 3.998476 5.636666 3.9418028
#9   i 3.734664 4.132215 1.7220438
#10  j 5.563223 5.098734 1.7784112
#
#$V4
#   id        b        c         d
#1   a 6.342768 5.140709 1.3168256
#2   b 7.572425 4.147767 2.2410894
#3   c 5.253265 6.903397 2.5894319
#4   d 6.306650 3.351814 1.0693751
#5   e 4.569514 5.759625 2.2974619
#6   f 7.194427 5.062291 5.1372771
#7   g 5.517932 4.610969 0.9724653
#8   h 7.317862 5.636666 3.9418028
#9   i 4.870168 4.132215 1.7220438
#10  j 5.073649 5.098734 1.7784112

Пример данных

set.seed(2017);
frame <- data.frame(id = letters[seq( from = 1, to = 10 )],
                    a = rnorm(10, 4), b = rnorm(10, 6), c=rnorm(10, 5),
                    d = rnorm(10, 2))

Лучше для всегда использовать фиксированное начальное число при предоставлении случайногоПример данных.

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