R data.table rbindlist

时间:2013-07-24 14:38:16

标签: r data.table rbind

我在使用包含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而没有重复的快速解决方案?

输出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

2 个答案:

答案 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行。