2016-06-30 105 views
0

轉換某些JSON數據後,我有一個數據框列表。幾個dataframes包括具有相同名稱的列:包含具有相同名稱的列的數據框列表

str(json) 
List of 2 
$ :'data.frame': 1 obs. of 2 variables: 
..$ a     :Factor 
.. ..- attr(*, "names")= chr "a" 
..$ b     :Factor 
.. ..- attr(*, "names")= chr "b" 
$ :'data.frame': 1 obs. of 3 variables: 
..$ a     :Factor 
.. ..- attr(*, "names")= chr "a" 
..$ b     :Factor 
.. ..- attr(*, "names")= chr "b" 
..$ b 
.. ..- attr(*, "names")= chr "b" 

其值:

json[[1]]     json[[2]] 
a b      a  b  b 
car boat     bus plane train 

我曾嘗試使用整個列表轉換成一個獨特的數據幀:

data <- rbind.fill(json) 

但是,只有第一列共享名稱被認爲是:

data 
    a b 
1 car boat 
2 bus plane 

我想獲得數據幀是這樣的:

data 
    a b 
1 car boat 
2 bus plane,train 

我怎麼能合併這樣的列?

由於R不允許我創建兩個具有相同名稱的列(如Shorpy的答案中所示),我的實際列表包含數百個列,所以我無法在實踐中再現最小示例。不過,我覺得dput輸出可以減少到這樣的事情:

dput(json) 
list(structure(list(`a` = structure(1L, .Names = "a", .Label = "car", class = "factor"), 
    `b` = structure(1L, .Names = "b", .Label = "boat", class = "factor") , .Names = c("a","b"), row.names = c(NA, -1L), class = "data.frame"), 
structure(list(`a` = structure(1L, .Names = "a", .Label = "bus", class = "factor"), 
    `b` = structure(1L, .Names = "b", .Label = "plane", class = "factor"), 
    `b` = structure(1L, .Names = "b", .Label = "train", class = "factor"), .Names = c("a","b","b"), row.names = c(NA, -1L), class = "data.frame")) 

我曾嘗試在此的其他問題解釋改變他們的名字來區分列:change column names with same name in dataframe in R。但是,在同一個數據框中可能會重複使用多個名稱,並且在不同的數據框中重複的名稱不一樣,這使得它更加複雜。

+0

你能粘貼到你的問題'dput(JSON)'的輸出。這將保留您數據的確切結構,並使我們可以輕鬆將其粘貼到我們的R會話中。 – eipi10

+0

@ eipi10我剛剛修改了我的問題。 –

回答

2

我會嘗試這樣的事:

library(purrr) 
library(dplyr) 
l <- list() 
l[[1]] <- data_frame(a = "car", b = "boat") 
l[[2]] <- data_frame(a = "car", b = "plane", b = "train") 


recode <- function(df){ 

    copies <- df[, names(df) == "b"] 
    out <- data_frame(a = df$a, 
        b = reduce(copies, paste)) 
    out 
} 

map_df(l, recode) 
+0

我認爲你的回答是正確的,但我有一些麻煩使它工作。是否可以修改它適用於「b」未知並且可能有多個重複的列名稱的一般情況? –

相關問題