簡體   English   中英

R:合並數據框列表

[英]R: Merging lists of data frames

我是 R 的完全菜鳥,我已經嘗試(並重試)尋找以下問題的答案,但我無法獲得任何建議的解決方案來做我感興趣的事情。

我有兩個命名元素列表,每個元素都指向具有相同布局的數據框:

(編輯)

df1 <- data.frame(A=c(1,2,3),B=c("A","B","C"))
df2 <- data.frame(A=c(98,99),B=c("Y","Z"))
lst1 <- c(X=df1,Y=df2)
df3 <- data.frame(A=c(4,5),B=c("D","E"))
lst2 <- c(X=df3)

(編輯 2)

因此,在列表中存儲多個數據幀似乎是一個壞主意,因為它會將數據幀轉換為列表。 因此,我將出去尋找一種替代方法來存儲一組命名數據框。

通常,兩個元素中元素的名稱可能部分重疊、完全重疊或根本不重疊。

我正在尋找一種將兩個列表合並為一個列表的方法:

<some-function-sequence>(lst1, lst2)
->
c(X=rbind(df1,df3),Y=df2)

- 導致這樣的事情:

[編輯:語法已更改以正確反映所需的結果(數據幀列表)] $XAB 1 1 A 2 2 B 3 3 C 4 4 D 5 5 E

$X.B
   A B
1 98 Y
2 99 Z

IE:

  • 如果列表包含相同的元素名稱,每個元素名稱都指向一個數據框,那么我想“綁定”這兩個數據框中的行,並將結果數據框分配給結果列表中的相同元素名稱。
  • 否則,應該將兩個列表中的元素名稱和數據框復制到結果列表中。

我已經嘗試了許多討論中的解決方案,例如:

- 但我一直無法找到正確的解決方案。 一個普遍的問題似乎是數據框最終被“mapply/sapply/merge/...”的應用程序轉換為一個列表 - 通常也以我不感興趣的方式切片和/或合並。 :)

對此的任何幫助將不勝感激!

[解決方案] 解決方案似乎是在收集數據幀到list(...)時更改c(...)的使用,之后 Pierre 提出的解決方案似乎給出了預期的結果。

以下解決方案可能不是最有效的方法。 但是,如果我解決了您的問題,這應該可行;)

# Example data

# Some vectors
a <- 1:5
b <- 3:7
c <- rep(5, 5)
d <- 5:1

# Some dataframes, data1 and data3 have identical column names
data1 <- data.frame(a, b)
data2 <- data.frame(c, b)
data3 <- data.frame(a, b)
data4 <- data.frame(c, d)

# 2 lists
list1 <- list(data1, data2)
list2 <- list(data3, data4)

# Loop, wich checks for the dataframe names and rbinds dataframes with the same column names
final_list <- list1
used_lists <- numeric()

for(i in 1:length(list1)) {

    for(j in 1:length(list2)) {

    if(sum(colnames(list1[[i]]) == colnames(list2[[j]])) == ncol(list1[[i]])) {

      final_list[[i]] <- rbind(list1[[i]], list2[[j]])
      used_lists <- c(used_lists, j)

    }
  }
}

# Adding the other dataframes, which did not have the same column names
for(i in 1:length(list2)) {

  if((i %in% used_lists) == FALSE) {

    final_list[[length(final_list) + 1]] <- list2[[i]]

  }
}

# Final list, which includes all other lists
final_list

這是使用splitc組合類似術語的建議解決方案。 請閱讀底部的警告:

s <- split(c(lst1, lst2), names(c(lst1,lst2))) 
lapply(s, function(lst) do.call(function(...) unname(c(...)), lst))
# $X.A
# [1] 1 2 3 4 5
# 
# $X.B
# [1] "A" "B" "C" "D" "E"
# 
# $Y.A
# [1] 98 99
# 
# $Y.B
# [1] "Y" "Z"

此解決方案基於不將因子作為字符串。 它不會拋出錯誤,但因子將轉換為數字。 下面我展示了我如何轉換數據以刪除因素。 如果您需要以下因素,請告訴我:

df1 <- data.frame(A=c(1,2,3),B=c("A","B","C"), stringsAsFactors=FALSE)
df2 <- data.frame(A=c(98,99),B=c("Y","Z"), stringsAsFactors=FALSE)
lst1 <- c(X=df1,Y=df2)
df3 <- data.frame(A=c(4,5),B=c("D","E"), stringsAsFactors=FALSE)
lst2 <- c(X=df3)

如果數據存儲在列表中,我們可以使用:

lapply(split(c(lst1, lst2), names(c(lst1,lst2))), function(lst) do.call(rbind, lst))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM