如何解决如何一个接一个地组合/连接两个数据帧但不合并 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 举报,一经查实,本站将立刻删除。