合并带后缀的奇数数据帧

问题描述 投票:0回答:1

我正试图合并一个数据框架列表,在这个社区里我遇到了许多不同的答案,比如这个 R--用合并和2个以上的后缀来减少(或:如何合并多个数据框并跟踪列)。 . 但是在研究了这些答案之后,它在偶数数据帧上可以工作,但在奇数数据帧上却不能工作。

myDF <- cbind(typecar = rownames(mtcars), mtcars)
rownames(myDF) <- NULL
df1 <- myDF
df2 <-  myDF
df3<- myDF
df4 <- myDF

for(i in head(seq_along(list.df), -1)) {

  res <- merge(res, list.df[[i+1]], all = TRUE, 
               suffixes = sfx[i:(i+1)], by = "typecar")
}

在这里,上面的代码在偶数df的情况下可以正常工作,就像下面的代码一样。

list.df <- list(df1, df2, df3,df4)
sfx <- c(".df1", ".df2", ".df3", ".df4")

但是当尝试使用奇数时,最后的.df3没有被添加为后缀。

list.df <- list(df1, df2, df3)
sfx <- c(".df1", ".df2", ".df3")

这里的colnames是这样的。

 [1] "typecar"  "mpg.df1"  "cyl.df1"  "disp.df1" "hp.df1"   "drat.df1" "wt.df1"   "qsec.df1" "vs.df1"   "am.df1"   "gear.df1" "carb.df1" "mpg.df2" 
[14] "cyl.df2"  "disp.df2" "hp.df2"   "drat.df2" "wt.df2"   "qsec.df2" "vs.df2"   "am.df2"   "gear.df2" "carb.df2" "mpg"      "cyl"      "disp"    
[27] "hp"       "drat"     "wt"       "qsec"     "vs"       "am"       "gear"     "carb"  

我想要的是

 [1] "typecar"  "mpg.df1"  "cyl.df1"  "disp.df1" "hp.df1"   "drat.df1" "wt.df1"   "qsec.df1" "vs.df1"   "am.df1"   "gear.df1" "carb.df1" "mpg.df2" 
[14] "cyl.df2"  "disp.df2" "hp.df2"   "drat.df2" "wt.df2"   "qsec.df2" "vs.df2"   "am.df2"   "gear.df2" "carb.df2" "mpg.df3"      "cyl.df3"      "disp.df3"    
[27] "hp.df3"       "drat.df3"     "wt.df3"       "qsec.df3"     "vs.df3"       "am.df3"       "gear.df3"     "carb.df3"  

尝试用dplyr加入,但同样的情况。遇到了这个 https:/github.comtidyversedplyrissues1296。 . 是否有任何方法,这工作在奇数的数据帧?

r join merge dplyr purrr
1个回答
1
投票

一个更简单的选择是将其命名为 list 元素列名与相应的 list 名称或对象名称作为后缀,但用作列名的列名除外。by 中的变量 merge.

list.df <- Map(function(x, nm) {i1 <- names(x) != 'typecar'
            names(x)[i1] <- paste0(names(x)[i1], ".", nm)
            x
    }, list.df, names(list.df))

然后,我们利用 Reduce/merge

out <- Reduce(function(...) merge(..., by = 'typecar', all = TRUE), list.df)
names(out)
#[1] "typecar"  "mpg.df1"  "cyl.df1"  "disp.df1" "hp.df1"   "drat.df1" "wt.df1"   "qsec.df1" "vs.df1"   "am.df1"   "gear.df1" "carb.df1"
#[13] "mpg.df2"  "cyl.df2"  "disp.df2" "hp.df2"   "drat.df2" "wt.df2"   "qsec.df2" "vs.df2"   "am.df2"   "gear.df2" "carb.df2" "mpg.df3" 
#[25] "cyl.df3"  "disp.df3" "hp.df3"   "drat.df3" "wt.df3"   "qsec.df3" "vs.df3"   "am.df3"   "gear.df3" "carb.df3"

资料

list.df <- mget(paste0('df', 1:3))

0
投票

你可以用:

do.call(rbind,list.df)
© www.soinside.com 2019 - 2024. All rights reserved.