按名称 Rbind 数组
Rbind arrays by names
我有两个命名数组,可能长度不同
row1<-c(a="a1",b="b1",c="c1")
row2<-c(a="a1",d="d1",b="b2",c="c2")
我想绑定它们保持名称的顺序,结果应该是:
a d b c
row1 "a1" NA "b1" "c1"
row2 "a1" "d1" "b2" "c2"
但使用通常的 rbind 结果是
a d b c
row1 "a1" "b1" "c1" "a1"
row2 "a1" "d1" "b2" "c2"
有什么建议吗?
谢谢
我会建议
n = sort(union(names(row1),names(row2)))
rbind(row1[n], row2[n])
# a b c <NA>
# [1,] "a1" "b1" "c1" NA
# [2,] "a1" "b2" "c2" "d1"
如果涉及到很多行,可以这样
myrows = list(row1,row2)
n = sort(Reduce(union, lapply(myrows, "names")))
do.call(rbind, lapply(myrows, `[`, n))
.
问题用 data.frame 标记,但示例使用矩阵。对于 data.frames,我会使用这些包之一:
# new example
r1<-data.frame(a="a1",b="b1",c="c1", stringsAsFactors=FALSE)
r2<-data.frame(a="a1",d="d1",b="b2",c="c2", stringsAsFactors=FALSE)
library(data.table)
rbindlist(list(r1,r2), fill=TRUE)
# a b c d
# 1: a1 b1 c1 NA
# 2: a1 b2 c2 d1
library(dplyr)
bind_rows(r1, r2)
# a b c d
# (chr) (chr) (chr) (chr)
# 1 a1 b1 c1 NA
# 2 a1 b2 c2 d1
同理,如果涉及的行数很多,rs = list(r1,r2)
,可以做rbindlist(rs, fill=TRUE)
或do.call(bind_rows, rs)
。
我有两个命名数组,可能长度不同
row1<-c(a="a1",b="b1",c="c1")
row2<-c(a="a1",d="d1",b="b2",c="c2")
我想绑定它们保持名称的顺序,结果应该是:
a d b c
row1 "a1" NA "b1" "c1"
row2 "a1" "d1" "b2" "c2"
但使用通常的 rbind 结果是
a d b c
row1 "a1" "b1" "c1" "a1"
row2 "a1" "d1" "b2" "c2"
有什么建议吗?
谢谢
我会建议
n = sort(union(names(row1),names(row2)))
rbind(row1[n], row2[n])
# a b c <NA>
# [1,] "a1" "b1" "c1" NA
# [2,] "a1" "b2" "c2" "d1"
如果涉及到很多行,可以这样
myrows = list(row1,row2)
n = sort(Reduce(union, lapply(myrows, "names")))
do.call(rbind, lapply(myrows, `[`, n))
.
问题用 data.frame 标记,但示例使用矩阵。对于 data.frames,我会使用这些包之一:
# new example
r1<-data.frame(a="a1",b="b1",c="c1", stringsAsFactors=FALSE)
r2<-data.frame(a="a1",d="d1",b="b2",c="c2", stringsAsFactors=FALSE)
library(data.table)
rbindlist(list(r1,r2), fill=TRUE)
# a b c d
# 1: a1 b1 c1 NA
# 2: a1 b2 c2 d1
library(dplyr)
bind_rows(r1, r2)
# a b c d
# (chr) (chr) (chr) (chr)
# 1 a1 b1 c1 NA
# 2 a1 b2 c2 d1
同理,如果涉及的行数很多,rs = list(r1,r2)
,可以做rbindlist(rs, fill=TRUE)
或do.call(bind_rows, rs)
。