R语言 合并两个没有公共列的数据表

blpfk2vs  于 2023-02-10  发布在  其他
关注(0)|答案(3)|浏览(186)

我想合并两个没有公共列的data. table,所以最后得到N1*N2行,其中N1N2是每个 Dataframe 中的行数。
以R为底数进行计算:

A <- data.frame(id = 1:6, value = 19:24)
B <- data.frame(value2 = c(25, 25, 26, 26), value3 = 4:5)

A
#>   id value
#> 1  1    19
#> 2  2    20
#> 3  3    21
#> 4  4    22
#> 5  5    23
#> 6  6    24

B
#>   value2 value3
#> 1     25      4
#> 2     25      5
#> 3     26      4
#> 4     26      5

merge(A, B, all = TRUE)
#>    id value value2 value3
#> 1   1    19     25      4
#> 2   2    20     25      4
#> 3   3    21     25      4
#> 4   4    22     25      4
#> 5   5    23     25      4
#> 6   6    24     25      4
#> 7   1    19     25      5
#> 8   2    20     25      5
#> 9   3    21     25      5
#> 10  4    22     25      5
#> 11  5    23     25      5
#> 12  6    24     25      5
#> 13  1    19     26      4
#> 14  2    20     26      4
#> 15  3    21     26      4
#> 16  4    22     26      4
#> 17  5    23     26      4
#> 18  6    24     26      4
#> 19  1    19     26      5
#> 20  2    20     26      5
#> 21  3    21     26      5
#> 22  4    22     26      5
#> 23  5    23     26      5
#> 24  6    24     26      5

但如果我现在有两个数据表,而不再有 Dataframe ,它会出错:

library(data.table)

A <- data.table(id = 1:6, value = 19:24)
B <- data.table(value2 = c(25, 25, 26, 26), value3 = 4:5)

merge(A, B, all = TRUE)
#> Error in merge.data.table(A, B, all = TRUE): A non-empty vector of column names for `by` is required.

如何使用data.table(不一定使用merge())重现base R行为?

d6kp6zgx

d6kp6zgx1#

您正在查找交叉联接。在data.table中,有一个CJ函数,但它只能处理一个数据集,否则您可以执行以下操作:

res <- setkey(A[, c(k=1, .SD)], k)[B[, c(k=1, .SD)], allow.cartesian = TRUE][, k := NULL]
res
    id value value2 value3
 1:  1    19     25      4
 2:  2    20     25      4
 3:  3    21     25      4
 4:  4    22     25      4
 5:  5    23     25      4
 6:  6    24     25      4
 7:  1    19     25      5
 8:  2    20     25      5
 9:  3    21     25      5
10:  4    22     25      5
11:  5    23     25      5
12:  6    24     25      5
13:  1    19     26      4
14:  2    20     26      4
15:  3    21     26      4
16:  4    22     26      4
17:  5    23     26      4
18:  6    24     26      4
19:  1    19     26      5
20:  2    20     26      5
21:  3    21     26      5
22:  4    22     26      5
23:  5    23     26      5
24:  6    24     26      5
    id value value2 value3

请注意替代dplyr解决方案:

dplyr::cross_join(A, B)
bqf10yzr

bqf10yzr2#

来自data.table repo上的GitHub问题的替代方案:

library(data.table)

A <- data.table(id = 1:6, value = 19:24)
B <- data.table(value2 = c(25, 25, 26, 26), value3 = 4:5)

CJDT <- function(...) {
  Reduce(function(DT1, DT2) cbind(DT1, DT2[rep(1:.N, each=nrow(DT1))]), list(...))
}

CJDT(A, B)
#>     id value value2 value3
#>  1:  1    19     25      4
#>  2:  2    20     25      4
#>  3:  3    21     25      4
#>  4:  4    22     25      4
#>  5:  5    23     25      4
#>  6:  6    24     25      4
#>  7:  1    19     25      5
#>  8:  2    20     25      5
#>  9:  3    21     25      5
#> 10:  4    22     25      5
#> 11:  5    23     25      5
#> 12:  6    24     25      5
#> 13:  1    19     26      4
#> 14:  2    20     26      4
#> 15:  3    21     26      4
#> 16:  4    22     26      4
#> 17:  5    23     26      4
#> 18:  6    24     26      4
#> 19:  1    19     26      5
#> 20:  2    20     26      5
#> 21:  3    21     26      5
#> 22:  4    22     26      5
#> 23:  5    23     26      5
#> 24:  6    24     26      5
#>     id value value2 value3

创建于2023年2月6日,使用reprex v2.0.2

q5lcpyga

q5lcpyga3#

A[, as.list(B), names(A)]

结果

id value value2 value3
 1:  1    19     25      4
 2:  1    19     25      5
 3:  1    19     26      4
 4:  1    19     26      5
 5:  2    20     25      4
 6:  2    20     25      5
 7:  2    20     26      4
 8:  2    20     26      5
 9:  3    21     25      4
10:  3    21     25      5
11:  3    21     26      4
12:  3    21     26      5
13:  4    22     25      4
14:  4    22     25      5
15:  4    22     26      4
16:  4    22     26      5
17:  5    23     25      4
18:  5    23     25      5
19:  5    23     26      4
20:  5    23     26      5
21:  6    24     25      4
22:  6    24     25      5
23:  6    24     26      4
24:  6    24     26      5

数据

A <- data.table(id = 1:6, value = 19:24)
B <- data.table(value2 = c(25, 25, 26, 26), value3 = 4:5)

相关问题