微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何一个接一个地组合/连接两个数据帧但不合并 R 中的公共列?

如何解决如何一个接一个地组合/连接两个数据帧但不合并 R 中的公共列?

假设有如下两个具有相同列名的数据框,我想一个一个地组合/连接而不合并公共列。有一种方法可以像 df1[3]

df1<-data.frame(A=c(1:10),B=c(2:5,rep(NA,6)))
df2<-data.frame(A=c(12:20),B=c(32:40))

预期输出

A  B  A.1 B.1
1  2  12  32
2  3  13  33
3  4  14  34
4  5  15  35
5  NA 16  36
6  NA 17  37
7  NA 18  38
8  NA 19  39
9  NA 20  40
10 NA NA  NA

解决方法

我倾向于将这样的多个框架作为 list of frames 处理。试试这个:

LOF <- list(df1,df2)
maxrows <- max(sapply(LOF,nrow))
out <- do.call(cbind,lapply(LOF,function(z) z[seq_len(maxrows),]))
names(out) <- make.names(names(out),unique = TRUE)
out
#     A  B A.1 B.1
# 1   1  2  12  32
# 2   2  3  13  33
# 3   3  4  14  34
# 4   4  5  15  35
# 5   5 NA  16  36
# 6   6 NA  17  37
# 7   7 NA  18  38
# 8   8 NA  19  39
# 9   9 NA  20  40
# 10 10 NA  NA  NA

这样做的一个优点是它允许您处理任意数量的帧,而不仅仅是两个。

,

一种基本的 R 方法可能是

setNames(Reduce(cbind.data.frame,Map(`length<-`,c(df1,df2),max(nrow(df1),nrow(df2)))),paste0(names(df1),rep(c('','.1'),each=2)))
#     A  B A.1 B.1
# 1   1  2  12  32
# 2   2  3  13  33
# 3   3  4  14  34
# 4   4  5  15  35
# 5   5 NA  16  36
# 6   6 NA  17  37
# 7   7 NA  18  38
# 8   8 NA  19  39
# 9   9 NA  20  40
# 10 10 NA  NA  NA
,

另一种选择是使用 int k = 5; string name = $"name-{k++:D3}.ext"; 函数。文档可能有点神秘,所以这里是参数的简短解释:

  • merge -- "名称 "row.names" 或数字 0 指定行名称"
  • by -- 保留两个数据帧中的所有原始行
  • all = TRUE -- 指定如何区分重复的列名
  • suffixes -- 保持原始排序
sort
,

一种方式是

cbind(
   df1,rbind(
      df2,rep(NA,nrow(df1) - nrow(df2))
   )
)
`````

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。