gpt4 book ai didi

r - data.table 合并产生额外的列 [R]

转载 作者:行者123 更新时间:2023-12-01 11:38:09 25 4
gpt4 key购买 nike

下面我定义了一个尺寸为 12x5 的主数据集。我把它分成四个data.tables,我想合并它们。 data.tables 和一些列名重叠之间没有行 ID 重叠。当我合并它们时,merge()不识别列名匹配,并为每个 data.table 中的每一列创建新列。最终合并的 data.table 应该是 12x5,但它是 12x7。我以为all=TRUE data.table 中的命令 merge()会解决这个问题。

library(data.table)

a <- data.table(id = c(1, 2, 3), C1 = c(1, 2, 3))
b <- data.table(id = c(4, 5, 6), C1 = c(1, 2, 3), C2 = c(2, 3, 4))
c <- data.table(id = c(7, 8, 9), C3 = c(5, 2, 7))
d <- data.table(id = c(10, 11, 12), C3 = c(8, 2, 3), C4 = c(4, 6, 8))

setkey(a, "id")
setkey(b, "id")
setkey(c, "id")
setkey(d, "id")

final <- merge(a, b, all = TRUE)
final <- merge(final, c, all = TRUE)
final <- merge(final, d, all = TRUE)

names(final)
dim(final) #outputs correct numb of rows, but too many columns

最佳答案

问题在于您使用“合并”功能的方式。
data.table 包中的 'merge' 函数默认通过“它们之间的共享键列”合并两个数据表。假设您像这样创建 'a' 和 'b' 数据表:

library(data.table)
a <- data.table(id = c(1, 2, 3), C1 = c(1, 2, 3))
b <- data.table(id = c(4, 5, 6), C1 = c(1, 2, 3), C2 = c(2, 3, 4))
setkey(a, "id")
setkey(b, "id")

其中 'a' 将是这样的:
   id C1
1: 1 1
2: 2 2
3: 3 3

'b' 将是这样的:
   id C1 C2
1: 4 1 2
2: 5 2 3
3: 6 3 4

现在,让我们先试试你的代码:
merge(a, b,  all = TRUE)

这是结果:
   id C1.x C1.y C2
1: 1 1 NA NA
2: 2 2 NA NA
3: 3 3 NA NA
4: 4 NA 1 2
5: 5 NA 2 3
6: 6 NA 3 4

这是因为“合并”函数仅将“id”字段(数据表“a”和“b”之间的共享键)作为合并列,同时将所有非共享列添加到结果数据表中。现在让我们尝试指定要合并的列:
merge(a, b, by=c("id","C1"), all = TRUE)

现在结果将是:
   id C1 C2
1: 1 1 NA
2: 2 2 NA
3: 3 3 NA
4: 4 1 2
5: 5 2 3
6: 6 3 4

这同样适用于您调用的其他合并函数。所以试试这个:
final <- merge(a, b, by=c("id","C1"), all = TRUE)
final <- merge(final, c, by="id", all = TRUE) #here you don't necessarily need to specify by...
final <- merge( final, d, by=c("id","C3"),all=TRUE)

dim(final)
[1] 12 5

关于r - data.table 合并产生额外的列 [R],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com