亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

同時合并列表中的多個data.frames

同時合并列表中的多個data.frames

森林海 2019-05-27 10:31:03
同時合并列表中的多個data.frames我有一個我要合并的許多data.frames的列表。這里的問題是每個data.frame在行數和列數方面都不同,但它們都共享關鍵變量(我已經調用過"var1","var2"在下面的代碼中)。如果data.frames在列方面是相同的,我只能rbind,plyr的rbind.fill可以完成這項工作,但這些數據并非如此。因為該merge命令僅適用于2個data.frames,所以我轉向Internet尋求創意。我從這里得到了這個,它在R 2.7.2中完美運行,這是我當時所擁有的:merge.rec <- function(.list, ...){     if(length(.list)==1) return(.list[[1]])     Recall(c(list(merge(.list[[1]], .list[[2]], ...)), .list[-(1:2)]), ...)}我會像這樣調用函數:df <- merge.rec(my.list, by.x = c("var1", "var2"),                  by.y = c("var1", "var2"), all = T, suffixes=c("", ""))但是在2.7.2之后的任何R版本中,包括2.11和2.12,此代碼失敗并出現以下錯誤:Error in match.names(clabs, names(xi)) :    names do not match previous names(很明顯,我在其他地方看到了其他對此錯誤的引用而沒有解決方案)。有什么方法可以解決這個問題嗎?
查看完整描述

4 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

另一個問題具體詢問如何在R中使用dplyr執行多個左連接。這個問題被標記為這個問題的副本,所以我在這里回答,使用下面的3個示例數據框:

library(dplyr)

x <- data_frame(i = c("a","b","c"), j = 1:3)

y <- data_frame(i = c("b","c","d"), k = 4:6)

z <- data_frame(i = c("c","d","a"), l = 7:9)

更新2018年6月:我將答案分為三個部分,分別代表三種不同的合并方式。purrr如果您已經在使用tidyverse軟件包,那么您可能希望使用這種方式。為了進行比較,您將找到使用相同樣本數據集的基本R版本。


reduce從purrr包中加入他們

該purrr包提供了一個reduce具有簡潔語法的函數:


library(tidyverse)

list(x, y, z) %>% reduce(left_join, by = "i")

#  A tibble: 3 x 4

#  i       j     k     l

#  <chr> <int> <int> <int>

# 1 a      1    NA     9

# 2 b      2     4    NA

# 3 c      3     5     7

您還可以執行其他連接,例如a full_join或inner_join:


list(x, y, z) %>% reduce(full_join, by = "i")

# A tibble: 4 x 4

# i       j     k     l

# <chr> <int> <int> <int>

# 1 a     1     NA     9

# 2 b     2     4      NA

# 3 c     3     5      7

# 4 d     NA    6      8


list(x, y, z) %>% reduce(inner_join, by = "i")

# A tibble: 1 x 4

# i       j     k     l

# <chr> <int> <int> <int>

# 1 c     3     5     7

dplyr::left_join() 與基地R Reduce()

list(x,y,z) %>%

    Reduce(function(dtf1,dtf2) left_join(dtf1,dtf2,by="i"), .)


#   i j  k  l

# 1 a 1 NA  9

# 2 b 2  4 NA

# 3 c 3  5  7

基礎R merge()與基礎RReduce()

為了進行比較,這里是左連接的基本R版本


 Reduce(function(dtf1, dtf2) merge(dtf1, dtf2, by = "i", all.x = TRUE),

        list(x,y,z))

#   i j  k  l

# 1 a 1 NA  9

# 2 b 2  4 NA

# 3 c 3  5  7


查看完整回答
反對 回復 2019-05-27
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

您可以merge_allreshape包中使用它。您可以傳遞參數以merge使用...參數

reshape::merge_all(list_of_dataframes, ...)

這是合并數據幀的不同方法的優秀資源。


查看完整回答
反對 回復 2019-05-27
?
蠱毒傳說

TA貢獻1895條經驗 獲得超3個贊

您可以使用遞歸來執行此操作。我沒有驗證以下內容,但它應該給你正確的想法:

MergeListOfDf = function( data , ... ){
    if ( length( data ) == 2 ) 
    {
        return( merge( data[[ 1 ]] , data[[ 2 ]] , ... ) )
    }    
    return( merge( MergeListOfDf( data[ -1 ] , ... ) , data[[ 1 ]] , ... ) )}


查看完整回答
反對 回復 2019-05-27
  • 4 回答
  • 0 關注
  • 1609 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號