0

我在使用包含 30 列左右的合理大小的 data.table 时遇到问题:(注意我在下面使用虚拟值)

使用rbindlist(list(dat, dat2))添加具有相同字段和另外 50000 行的新 data.table 会产生不正确的新主 data.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 而不重复?

rbind 和 rbindlist 的输出

    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
4

2 回答 2

3

尝试使用unique

 unique(rbind(dat1, dat2))
于 2013-07-24T15:31:58.940 回答
1

您的问题是,在创建时newTable.df您有以下行:

factor = sample(c(TRUE, FALSE), 10, replace = TRUE)

这会导致结果表有 10 行(而不是您想要的 5 行)。将这个 10 更改为 5 后,dat2data.table 将有 5 行,并且rbind(dat, dat2)将有 15 行。

于 2017-05-30T20:55:36.713 回答