2016-09-07 9 views
3

私はdata.framesのリストを積み重ねたいですが、列に異なるデータ型があることがあります。私は操作が最も低い共通分母(私の場合は通常character)に強制することを望みます。異なるデータ型のbind_rows

このスタッキングは、ほぼすべてのdata.framesを受け入れるpackage functionの内部で行われます。 ds_a$xbind_rows()の前の文字に強制的に変換する能力は、現実的にはありません。

ds_a <- data.frame(
    x = 1:6, 
    stringsAsFactors = FALSE 
) 
ds_b <- data.frame(
    x = c("z1", "z2"), 
    stringsAsFactors = FALSE 
) 

# These four implementations throw: 
# Error: Can not automatically convert from integer to character in column "x". 
ds_1 <- dplyr::bind_rows(ds_a, ds_b) 
ds_2 <- dplyr::bind_rows(ds_b, ds_a) 
ds_3 <- dplyr::bind_rows(list(ds_a, ds_b)) 
ds_4 <- dplyr::union_all(ds_a, ds_b) 

私は出力を単一の文字ベクトルとdata.frameになりたい:

x 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 z1 
8 z2 

私は(赤帽)データベースからメタデータを使用するには、いくつかの長期的な計画を持っています強要に影響を与えることができますが、私は積み上げ作業のための短期的な一般的な解決策があることを望んでいます。

+0

からrbindlistを使用することができます。バッチ処理されたAPI呼び出しをまとめてバインドしたいと思うので、すべて同じ名前にする必要があります。 – Benjamin

+0

私は通常、このような状況の要因に変換しますが、すべての列をfactor列に変換してから変換すると、速度にどの程度影響するかわかりません。 – Hao

答えて

5

私たちは、それは同様に `rbind`で動作しますdata.table

library(data.table) 
rbindlist(list(ds_a, ds_b)) 
# x 
#1: 1 
#2: 2 
#3: 3 
#4: 4 
#5: 5 
#6: 6 
#7: z1 
#8: z2 
+0

したがって、これを 'data.table ' - チベットからの変換(そして場合によってはこれに戻る)に何らかの損失がありますか? –

+0

@geryan私の知る限りではありません。 'tibble'に変換すると、いくつかの属性が追加され、他の属性が削除されます – akrun

関連する問題