R:重复矩阵中的消除,跟踪多重性

时间:2014-01-30 11:16:41

标签: r matrix

我对R有一个基本问题 我制作了矩阵

M
     [,1] [,2]
[1,] "a"  "1" 
[2,] "b"  "2" 
[3,] "a"  "3" 
[4,] "c"  "1" 

我想获得3X2矩阵

     [,1] [,2] [,3]
[1,] "a"  "1"  "3" 
[2,] "b"  "2"  NA  
[3,] "c"  "1"  NA  

通过消除M[,1]中的重复项并在N[i,2], N[i,3]中写入M[,2]中与M[,1]中相同元素相对应的值来获取所有i。 "NA"中的N[,3]对应M[,1]中的单身人士。

我知道如何消除R中向量的重复:我的问题是跟踪M[,2]中的元素并将其写入结果矩阵N。我尝试了for次循环,但是在我的“真实世界”情况下,它们的效果不是很好。矩阵要大得多。

有什么建议吗?

我非常感谢你。

1 个答案:

答案 0 :(得分:1)

将矩阵转换为data.frame后,您可以在reshape2包中使用dcast。要撤消此过程,您可以使用melt

df = data.frame(c("a","b","a","c"),c(1:3,1))
colnames(df) = c("factor","obs")
require(reshape2)
df2=dcast(df, factor ~ obs)

现在df2是:

 factor  1  2  3
1      a  1 NA  3
2      b NA  2 NA
3      c  1 NA NA

对我来说,保持这样更有意义。但如果你需要它的格式:

res = t(apply(df2,1,function(x) {  newLine = as.vector(x[which(!is.na(x))],mode="any"); newLine=c(newLine,rep(NA, ncol(df2)-length(newLine) )) }))
res = res[,-ncol(res)]                           

     [,1] [,2] [,3]
[1,] "a"  " 1" " 3"
[2,] "b"  " 2" NA  
[3,] "c"  " 1" NA