我在使用包含30个左右列的合理大小的data.table时遇到问题:(注意我在下面使用虚拟值)
使用rbindlist(list(dat, dat2))
添加具有相同字段和另外50000行的新data.table会产生不正确的新主数据.table。
是否有一个简单而快速的解决方案,可以将新行添加到data.table,其中列字段全部匹配?
为了简化,我创建了一个虚拟数据集。
master.df <- data.frame(id = letters[1:10],
mpg = sample(c(20,22), 10, replace = TRUE),
cyl = sample(c(4,8), 10, replace = TRUE),
disp = sample(c(160,300), 10, replace = TRUE),
factor = sample(c(TRUE, FALSE), 10, replace = TRUE),
hp = sample(c(20,22), 10, replace = TRUE))
newTable.df <- data.frame(id = letters[11:15],
mpg = sample(c(20,22), 5, replace = TRUE),
cyl = sample(c(4,8), 5, replace = TRUE),
disp = sample(c(160,300), 5, replace = TRUE),
factor = sample(c(TRUE, FALSE), 10, replace = TRUE),
hp = sample(c(20,22), 5, replace = TRUE))
library(data.table)
dat = as.data.table(master.df)
dat2 = as.data.table(newTable.df)
使用rbind(dat,dat2)
输出重复的dat2。 (预计应该总共15行)
我阅读论坛以获得更好的解决方案,而rbindlist
提出了一些问题,但这看起来并不像是诀窍。与rbind
是否存在将dat2绑定到dat而没有重复的快速解决方案?
id mpg cyl disp factor hp
1: a 22 8 300 FALSE 20
2: b 20 8 300 TRUE 20
3: c 20 8 160 FALSE 20
4: d 20 4 300 TRUE 22
5: e 22 4 160 FALSE 22
6: f 22 4 160 TRUE 22
7: g 20 8 160 FALSE 20
8: h 22 4 300 FALSE 20
9: i 22 4 160 FALSE 20
10: j 22 8 160 TRUE 22
11: k 22 8 160 FALSE 20
12: l 22 8 160 TRUE 20
13: m 20 8 300 TRUE 20
14: n 22 4 300 FALSE 20
15: o 20 8 160 FALSE 20
16: k 22 8 160 FALSE 20
17: l 22 8 160 FALSE 20
18: m 20 8 300 FALSE 20
19: n 22 4 300 TRUE 20
20: o 20 8 160 TRUE 20
答案 0 :(得分:3)
尝试使用unique
:
unique(rbind(dat1, dat2))
答案 1 :(得分:1)
您的问题是,在创建newTable.df
时,您有以下一行:
factor = sample(c(TRUE, FALSE), 10, replace = TRUE)
这会导致生成的表有10行(而不是您想要的5行)。将此10更改为5后,dat2
data.table将包含5行,rbind(dat, dat2)
将包含15行。