我试图合并(联接)多个数据表(从5 csv文件中获得fread),以形成一个单一的数据表。当我尝试合并5个数据表时,我得到一个错误,但当我只合并4时,工作正常。MWE如下:
# example data
DT1 <- data.table(x = letters[1:6], y = 10:15)
DT2 <- data.table(x = letters[1:6], y = 11:16)
DT3 <- data.table(x = letters[1:6], y = 12:17)
DT4 <- data.table(x = letters[1:6], y = 13:18)
DT5 <- data.table(x = letters[1:6], y = 14:19)
# this gives an error
Reduce(function(...) merge(..., all = TRUE, by = "x"), list(DT1, DT2, DT3, DT4, DT5))
合并.数据.表中的错误(...,全部= TRUE,按=“x”):x有一些重复的列名:y.x,y.y。请删除或重命名重复项,然后重试。
# whereas this works fine
Reduce(function(...) merge(..., all = TRUE, by = "x"), list(DT1, DT2, DT3, DT4))
x y.x y.y y.x y.y
1: a 10 11 12 13
2: b 11 12 13 14
3: c 12 13 14 15
4: d 13 14 15 16
5: e 14 15 16 17
6: f 15 16 17 18
我有一个解决方法,如果我更改DT1的第二列名称:
setnames(DT1, "y", "new_y")
# this works now
Reduce(function(...) merge(..., all = TRUE, by = "x"), list(DT1, DT2, DT3, DT4, DT5))
为什么会发生这种情况?有没有办法合并任意数量的具有相同列名的数据表,而不更改任何列名?
7条答案
按热度按时间k10s72fa1#
如果只有这5个数据表(其中
x
对于所有数据表都是相同的),您还可以使用嵌套连接:或者正如@Frank在评论中所说:
其给出:
这给出了相同的结果:
当
x
列的值不相同时,嵌套联接将无法提供所需的解决方案:这给出:
同时:
给出:
为了使包含
Reduce
的代码正常工作,我更改了y
列的名称。kyxcudwk2#
如果你想在合并过程中重命名一个计数器,这里有一个方法可以将计数器保留在
Reduce
内:esyap4oy3#
堆叠和整形我不认为这与
merge
函数完全对应,但是...我不知道这是否会扩展到拥有比
y
更多的列。合并-分配
(我不确定这是否完全扩展到其他情况。很难说,因为OP的示例实际上并不要求
merge
的全部功能。在OP的情况下,mycols="x"
和x
在所有DT*
中都是相同的,显然合并是不合适的,正如@eddi所提到的。不过,一般的问题很有趣,所以这就是我想攻击的。)tyu7yeag4#
使用整形功能可以在如何命名列方面提供更大的灵活性。
或者这个也行
yv5phkfx5#
另一种方法是:
在“data.table::dcast”中添加了包名,以确保即使加载了“reforme2”包,调用也会返回一个数据表而不是 Dataframe 。在不明确提及包名的情况下,可以使用来自reforme2包的dcast函数,该函数作用于data.frame,并返回一个data.frame而不是data.table。
jljoyd4f6#
或者,您可以对前面的列执行
setNames
,然后像这样执行merge
ih99xse17#
这是一个替代解决方案-您可以每次定义联接列(当x列的值不相同时)。您需要定义带有列名的向量。然后,您可以按如下方式通过引用进行链式联接: