2017-09-22 3 views
1

私は約40列の大きなdata.tableを持っています.40列のうちの3つのみ(残りはNA)のレコードを追加する必要があります。再現性の例を作成するには:NA値のデータバインドをバインドする

require(data.table) 
data(iris) 
setDT(iris) 

# this works (and is the expected result): 
rbind(iris, list(6, NA, NA, NA, "test")) 

問題は、私は37+空の列を(私が入力したいデータが変数の第一、第二および第37列にある)があります。だから、私はのいくつかのrepにする必要があります。しかし、私が試してみると:

rbind(iris, list(6, rep(NA, 3), "test")) 

それは動作しません(サイズは異なります)。私はすることができます

rbind(iris, list(c(6, rep(NA, 3), "test"))) 

しかし、(明らかに)最初の列全体を強制的にcharに強制します。私はリストをリストから外してみました。list(c(シーケンスを反転させました(それはリストを受け入れるだけです)。まだ何も見つかりませんでした。

私はこれを行うことができるので、これはrbind data.tablesに関する(複数の)投稿と重複していないことに注意してください。私ができなかったのは、を使って、適切なデータクラスを維持することです。これはrep(NA, x)です。

答えて

3

あなたが行うことができます...

rbind(data.table(iris), c(list(6), logical(3), list("test"))) 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
    1:   5.1   3.5   1.4   0.2 setosa 
    2:   4.9   3.0   1.4   0.2 setosa 
    3:   4.7   3.2   1.3   0.2 setosa 
    4:   4.6   3.1   1.5   0.2 setosa 
    5:   5.0   3.6   1.4   0.2 setosa 
---                
147:   6.3   2.5   5.0   1.9 virginica 
148:   6.5   3.0   5.2   2.0 virginica 
149:   6.2   3.4   5.4   2.3 virginica 
150:   5.9   3.0   5.1   1.8 virginica 
151:   6.0   NA   NA   NA  test 

logical(n)rep(NA, n)と同じです。 irisdata.table()にラップするので、rbind.data.frameの代わりにrbindlistを使用し、"test"を無効なレベルではなく新しい要因として扱います。


私は、これらのアプローチが明確であり、列カウントをいじる必要はありません

newrow = setDT(iris[NA_integer_, ]) 
newrow[, `:=`(Sepal.Length = 6, Species = factor("test")) ] 
rbind(data.table(iris), newrow) 

# or 

rbind(data.table(iris), list(Sepal.Length = 6, Species = "test"), fill=TRUE) 

...のような、しかし、行くためのより良い方法があると思います。

私はnewrowの方が好きです。データ変換を確認するために検査できる表が残っているからです。 1( `data.table(アイリス)[C:

+0

もうあまりにも巧妙なバイ半分アイデアをコメントすることができます( "test"))] [] '\ n"、 " – Frank

2

我々はreplicate

rbind(iris, c(6, replicate(3, NA, simplify = FALSE), "test")) 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
# 1:   5.1   3.5   1.4   0.2 setosa 
# 2:   4.9   3.0   1.4   0.2 setosa 
# 3:   4.7   3.2   1.3   0.2 setosa 
# 4:   4.6   3.1   1.5   0.2 setosa 
# 5:   5.0   3.6   1.4   0.2 setosa 
# ---                
#147:   6.3   2.5   5.0   1.9 virginica 
#148:   6.5   3.0   5.2   2.0 virginica 
#149:   6.2   3.4   5.4   2.3 virginica 
#150:   5.9   3.0   5.1   1.8 virginica 
#151:   6.0   NA   NA   NA  test 

を使用するか、または@Frankとして

rbind(iris, c(6, as.list(rep(NA, 3)), "test")) 
関連する問題