我有一个矩阵,它具有数据帧的列索引。我想使用与索引对应的值构建另一个数据框,其顺序与矩阵中的顺序相同。
矩阵是m1 <- sapply(df[,5:58],function(x){order(-x)})
的结果而创建的,其中df是具有258行和59列的原始数据帧。矩阵(258x54)是对数据帧的54列中的每一列进行独立排序的结果,因为我想创建一个数据帧,每列有前10个值。
如何从矩阵索引(m1)获取结果数据帧,矩阵索引将具有与原始数据帧(df)对应的值,但是按矩阵位置指定的顺序。 for循环可以是构建数据框的解决方案,但是有一个应用程序或其他函数来执行此操作吗?
我找到了一个使用mapply的解决方案:
matrix(mapply(function(x,y){df[x,y]},
as.list(t(m1)),rep((5:58),258)),
nrow=258,ncol=54,byrow=T)
答案 0 :(得分:0)
假设,如果数据是(虽然我没有完全理解逻辑):
set.seed(14)
dat <- as.data.frame(matrix(sample(1:80, 258*59,replace=TRUE), ncol=59))
m1 <- sapply(dat[,5:58], function(x) order(-x))
res1 <- matrix(dat[cbind(c(t(m1)),rep(5:58,258))],nrow=258, ncol=54, byrow=TRUE)
您的解决方案
res2 <- matrix(mapply(function(x,y){dat[x,y]},
as.list(t(m1)),rep((5:58),258)),
nrow=258,ncol=54,byrow=T)
identical(res1,res2)
#[1] TRUE