Проблема с expand.grid с неравной длиной вектора - PullRequest
2 голосов
/ 19 июня 2019

У меня есть фрейм данных, и я хочу создать еще один фрейм данных со всеми возможными комбинациями различных значений каждой переменной первого фрейма данных

dt = data.frame(A = c(10,2,3,8,2), B = c("K","F","F","K","K"))

dt1 <- dt %>%  distinct(A)
dt2 <- dt %>%  distinct(B)

expand.grid(A = dt1, B = dt2)

Однако этот код возвращает следующую ошибку:

Warning message:
In format.data.frame(if (omit) x[seq_len(n0), , drop = FALSE] else x,  :
  corrupt data frame: columns will be truncated or padded with NAs

Ответы [ 4 ]

3 голосов
/ 19 июня 2019

expand.grid пересекает векторы, а не фреймы данных.Если у вас есть только один столбец в каждом фрейме данных, вы можете сделать это (без tidyverse):

expand.grid(A=unique(dt$A), B=unique(dt$B))

Если у вас есть несколько столбцов, я думаю, что это должно работать:

do.call(expand.grid,c(unique(dt["A"]),unique(dt["B"])))

, хотяcrossing(), вероятно, лучшая идея, если вы уже находитесь в тививерсе.

2 голосов
/ 19 июня 2019

Для этой цели можно использовать crossing

library(tidyr)
crossing(dt1, dt2)

Кроме того, если мы объединяем (c) наборы данных, он становится list и expand.grid работает с ним (в дополнение к другим ответам, извлекаемым как vector)

expand.grid(c(dt1, dt2))
1 голос
/ 19 июня 2019

dt1 и dt2 - это dataframes в вашем коде.

expand.grid(A = dt1$A, B = dt2$B)
   A B
1 10 K
2  2 K
3  3 K
4  8 K
5 10 F
6  2 F
7  3 F
8  8 F
0 голосов
/ 19 июня 2019

Использование data.table:

library(data.table)
setDT(dt)
dt[, CJ(A, B, unique = TRUE)]

#     A B
# 1:  2 F
# 2:  2 K
# 3:  3 F
# 4:  3 K
# 5:  8 F
# 6:  8 K
# 7: 10 F
# 8: 10 K
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...