我有一个数据框,我想创建另一个数据框,并使用第一个数据框每个变量的不同值的所有可能组合
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
答案 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
)数据集,它会变成list
,expand.grid
会在其上起作用(除了其他答案会提取为vector
)
expand.grid(c(dt1, dt2))
答案 2 :(得分:1)
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
答案 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