我对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
次循环,但是在我的“真实世界”情况下,它们的效果不是很好。矩阵要大得多。
有什么建议吗?
我非常感谢你。
答案 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