1

我正在尝试将几个文件放在一起,并且需要对在循环中创建的列名进行一堆合并。我可以很好地做到这一点,data.frame()但在使用类似代码时遇到问题data.table()

library(data.table)

df1 <- data.frame(id = 1:20, col1 =  runif(20))
df2 <- data.frame(id = 1:20, col1 =  runif(20))

newColNum <- 5
newColName <- paste('col',newColNum ,sep='')

df1[,newColName] <- runif(20)

df2 <- merge(df2, df1[,c('id',newColName)], by = 'id', all.x = T) # Works fine
######################

dt1 <- data.table(id = 1:20, col1 =  runif(20))
dt2 <- data.table(id = 1:20, col1 =  runif(20))

newColNum <- 5
newColName <- paste('col',newColNum ,sep='')

dt1[,newColName] <- runif(20)

dt2 <- merge(dt2, dt1[,c('id',newColName)], by = 'id', all.x = T) # Doesn't work

有什么建议么?

4

2 回答 2

1

这实际上与 无关merge(),并且与j(即列)索引默认情况下如何解释[.data.table()有关

您可以通过设置使整个语句工作with=FALSE,这会导致j索引被解释为它在 a 中的样子data.frame

dt2 <- merge(dt2, dt1[,c('id',newColName), with=FALSE], by = 'id', all.x = T)
head(dt2, 3)
#    id      col1       col5
# 1:  1 0.4954940 0.07779748
# 2:  2 0.1498613 0.12707070
# 3:  3 0.8969374 0.66894157

更准确地说,来自?data.table

with:默认情况下,“with=TRUE”和“j”在“x”的框架内进行评估。列名可以用作变量。当 'with=FALSE' 时,'j' 是要选择的名称或位置的向量。

请注意,可以通过将列存储在变量中来避免这种情况,如下所示:

cols = c('id', newColName)
dt1[ , ..cols]

..发出“查找一级”的信号

于 2013-11-05T16:58:23.357 回答
0

试试dt1[,list(id,get(newColName))]你的合并。

于 2013-11-05T16:58:58.140 回答