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インデックスは のように解釈されます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]

..「1 レベル上を検索する」信号

于 2013-11-05T16:58:23.357 に答える
0

dt1[,list(id,get(newColName))]マージしてみてください。

于 2013-11-05T16:58:58.140 に答える