向量长度不均匀的expand.grid问题

时间:2019-06-19 07:42:35

标签: r

我有一个数据框,我想创建另一个数据框,并使用第一个数据框每个变量的不同值的所有可能组合

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 个答案:

答案 0 :(得分:3)

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()可能是一个更好的主意,如果您已经在tidyverse中。

答案 1 :(得分:2)

为此,可以使用crossing

library(tidyr)
crossing(dt1, dt2)

此外,如果我们连接(c)数据集,它会变成listexpand.grid会在其上起作用(除了其他答案会提取为vector

expand.grid(c(dt1, dt2))

答案 2 :(得分:1)

dt1dt2在您的代码中是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

答案 3 :(得分:0)

使用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