2016-09-07 34 views
3

我想疊加一個data.frames列表,但有時這些列有不同的數據類型。我希望該操作能夠強制使用最低公分母(在我的情況下通常是character)。不同數據類型的bind_rows

此堆棧發生在package function之內,它接受幾乎任何data.frames列表。它實際上不具備在bind_rows()之前將ds_a$x強制給角色的能力。

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

它與'rbind'爲好。我認爲你想要將批量的API調用綁定在一起,所以它們應該都具有相同的名稱。 – Benjamin

+0

我通常會將它們轉換爲這種情況下的因素,但我不確定它會在多大程度上影響速度,如果將每列轉換爲因子列,然後將它們轉換回來。 – Hao

回答

5

我們可以使用rbindlistdata.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 ' - 這個轉變(可能回到)'tibble'有沒有損失? –

+0

@geryan不是我所知。當你轉換爲'tibble'時,會添加一些屬性,並刪除其他一些屬性 – akrun