如何根据行名组合不同的矩阵?
How to combine different matries acording to their row names?
假设我有矩阵 A:
rows.names Value
----------------
man NA
woman NA
girl NA
boy NA
cat NA
dog NA
还有一些矩阵(B、C、D 等)如下所示:
rows.names V1
--------------
woman 3
dog 5
rows.names V2
--------------
man 4
woman 7
cat 6
rows.names V3
---------------
boy 17
cat 10
dog 1
我想根据 row.names 加入那 4 个(用 NA 替换缺失的数据):
row.names Value V1 V2 V3
--------------------------------
man NA NA 4 NA
woman NA 3 7 NA
girl NA NA NA NA
boy NA NA NA 17
cat NA NA 6 10
dog NA 5 NA 1
如何做到这一点?谢谢
你的标题说 "matrices" 但你的问题被标记为 data.frame
,所以这里有一个方法假设你正在处理 data.frame
s:
df1 <- data.frame(rn = c("man", "woman", "girl", "boy", "cat", "dog"),
Value = NA)
df2 <- data.frame(rn = c("woman", "dog"), V1 = c(3, 5))
df3 <- data.frame(rn = c("man", "woman", "cat"), V2 = c(4, 7, 6))
df4 <- data.frame(rn = c("boy", "cat", "dog"), V3 = c(17, 10, 1))
library(reshape2)
dcast(melt(mget(ls(pattern = "df\d")), id.vars = "rn"),
rn ~ variable, value.var = "value")
# rn Value V1 V2 V3
# 1 boy NA NA NA 17
# 2 cat NA NA 6 10
# 3 dog NA 5 NA 1
# 4 girl NA NA NA NA
# 5 man NA NA 4 NA
# 6 woman NA 3 7 NA
一般的想法是使用 mget
在 list
中捕获所有相关的 objects(当然,您也可以手动执行此操作)。然后,使用melt
的list
方法将所有内容组合成"long"data.frame
。然后可以使用 dcast
.
轻松地对其进行重塑
如果您有矩阵,方法类似(可能更简单):
m1 <- `rownames<-`(as.matrix(df1[-1]), df1[[1]])
m2 <- `rownames<-`(as.matrix(df2[-1]), df2[[1]])
m3 <- `rownames<-`(as.matrix(df3[-1]), df3[[1]])
m4 <- `rownames<-`(as.matrix(df4[-1]), df4[[1]])
dcast(melt(mget(ls(pattern = "m\d"))), Var1 ~ Var2, value.var = "value")
# Var1 Value V1 V2 V3
# 1 man NA NA 4 NA
# 2 woman NA 3 7 NA
# 3 girl NA NA NA NA
# 4 boy NA NA NA 17
# 5 cat NA NA 6 10
# 6 dog NA 5 NA 1
看起来这行得通。只需将行名称与值矩阵匹配,然后替换为一个子集。 vapply
会将其简化为我们可以 cbind
与主矩阵一起使用的矩阵。
mlist <- list(m2, m3, m4)
newPart <- vapply(mlist, function(x) {
x[match(rownames(m1), rownames(x))]
}, numeric(nrow(m1)))
cbind(m1, provideDimnames(newPart))
# Value A B C
# man NA NA 4 NA
# woman NA 3 7 NA
# girl NA NA NA NA
# boy NA NA NA 17
# cat NA NA 6 10
# dog NA 5 NA 1
假设我有矩阵 A:
rows.names Value
----------------
man NA
woman NA
girl NA
boy NA
cat NA
dog NA
还有一些矩阵(B、C、D 等)如下所示:
rows.names V1
--------------
woman 3
dog 5
rows.names V2
--------------
man 4
woman 7
cat 6
rows.names V3
---------------
boy 17
cat 10
dog 1
我想根据 row.names 加入那 4 个(用 NA 替换缺失的数据):
row.names Value V1 V2 V3
--------------------------------
man NA NA 4 NA
woman NA 3 7 NA
girl NA NA NA NA
boy NA NA NA 17
cat NA NA 6 10
dog NA 5 NA 1
如何做到这一点?谢谢
你的标题说 "matrices" 但你的问题被标记为 data.frame
,所以这里有一个方法假设你正在处理 data.frame
s:
df1 <- data.frame(rn = c("man", "woman", "girl", "boy", "cat", "dog"),
Value = NA)
df2 <- data.frame(rn = c("woman", "dog"), V1 = c(3, 5))
df3 <- data.frame(rn = c("man", "woman", "cat"), V2 = c(4, 7, 6))
df4 <- data.frame(rn = c("boy", "cat", "dog"), V3 = c(17, 10, 1))
library(reshape2)
dcast(melt(mget(ls(pattern = "df\d")), id.vars = "rn"),
rn ~ variable, value.var = "value")
# rn Value V1 V2 V3
# 1 boy NA NA NA 17
# 2 cat NA NA 6 10
# 3 dog NA 5 NA 1
# 4 girl NA NA NA NA
# 5 man NA NA 4 NA
# 6 woman NA 3 7 NA
一般的想法是使用 mget
在 list
中捕获所有相关的 objects(当然,您也可以手动执行此操作)。然后,使用melt
的list
方法将所有内容组合成"long"data.frame
。然后可以使用 dcast
.
如果您有矩阵,方法类似(可能更简单):
m1 <- `rownames<-`(as.matrix(df1[-1]), df1[[1]])
m2 <- `rownames<-`(as.matrix(df2[-1]), df2[[1]])
m3 <- `rownames<-`(as.matrix(df3[-1]), df3[[1]])
m4 <- `rownames<-`(as.matrix(df4[-1]), df4[[1]])
dcast(melt(mget(ls(pattern = "m\d"))), Var1 ~ Var2, value.var = "value")
# Var1 Value V1 V2 V3
# 1 man NA NA 4 NA
# 2 woman NA 3 7 NA
# 3 girl NA NA NA NA
# 4 boy NA NA NA 17
# 5 cat NA NA 6 10
# 6 dog NA 5 NA 1
看起来这行得通。只需将行名称与值矩阵匹配,然后替换为一个子集。 vapply
会将其简化为我们可以 cbind
与主矩阵一起使用的矩阵。
mlist <- list(m2, m3, m4)
newPart <- vapply(mlist, function(x) {
x[match(rownames(m1), rownames(x))]
}, numeric(nrow(m1)))
cbind(m1, provideDimnames(newPart))
# Value A B C
# man NA NA 4 NA
# woman NA 3 7 NA
# girl NA NA NA NA
# boy NA NA NA 17
# cat NA NA 6 10
# dog NA 5 NA 1