我们说我有矩阵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个(用NAs替换丢失的数据):
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
如何做到这一点?感谢。
答案 0 :(得分:3)
你的标题是" 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
中的所有相关对象(当然,您也可以手动执行此操作)。然后,使用list
melt
方法将所有内容组合成一个&#34; long&#34; 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
答案 1 :(得分:2)
看起来这样可行。只需将行名称与Value矩阵匹配,然后替换为子集。 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