R对角矩阵误差
R diagonal matrix error
我有以下类型的数据框
A B C D
1 0 1 10
0 2 1 15
1 1 0 11
我想要以下输出
A B C D
1 0 1 10
1 1 0 11
0 2 1 15
我试过这个代码
require(permute)
z <- apply(permute::allPerms(1:nrow(DF)), 1, function(x){
mat <- as.matrix(DF,2:ncol(DF)])
if(all(diag(mat[x,]) == rep(1,nrow(DF)))){
return(df[x,])} })
我无法获得所需的输出。
(Link 以上代码- )
我请求有人指导我。数据框是一个小样本,但我有一个结构相似的大样本。
只要每个合适的列中至少有一个 1,下面的方法就可以工作。它是确定性的,所以总是只找到第一个 1 并将其与对角线位置的数字交换。但没有组合爆炸。也许有人可以找到更优雅(或矢量化)的解决方案???
fn<- function(colm){
i1<-match(1, colm)
colm[i1]<- colm[i]
colm[i]<-1
return(colm)
}
for(i in 1:nrow(DF))
{
DF[,i]=fn(DF[,i])
}
编辑
虽然这个答案在重读时被接受了(所以我不能删除)但我认为它没有完全按照你的要求做...
下面的代码应该可以解决这个问题..
DF<-read.table(text="A B C D
13 0 0 1
1 0 1 10
0 2 1 15
1 1 0 11", header=T)
rem<-1:nrow(DF)
for(i in 1:nrow(DF))
{
temp<-DF[i,]
any1<-intersect(rem, which(DF[,i]==1))
best1<-which.min(rowSums(DF[any1,]==1))
firsti<-any1[best1]
DF[i,]<-DF[firsti,]
DF[firsti,]<-temp
rem<-setdiff(rem, i)
}
DF
A B C D
1 1 0 1 10
2 1 1 0 11
3 0 2 1 15
4 13 0 0 1
很抱歉造成混淆。
我有以下类型的数据框
A B C D
1 0 1 10
0 2 1 15
1 1 0 11
我想要以下输出
A B C D
1 0 1 10
1 1 0 11
0 2 1 15
我试过这个代码
require(permute)
z <- apply(permute::allPerms(1:nrow(DF)), 1, function(x){
mat <- as.matrix(DF,2:ncol(DF)])
if(all(diag(mat[x,]) == rep(1,nrow(DF)))){
return(df[x,])} })
我无法获得所需的输出。
(Link 以上代码-
我请求有人指导我。数据框是一个小样本,但我有一个结构相似的大样本。
只要每个合适的列中至少有一个 1,下面的方法就可以工作。它是确定性的,所以总是只找到第一个 1 并将其与对角线位置的数字交换。但没有组合爆炸。也许有人可以找到更优雅(或矢量化)的解决方案???
fn<- function(colm){
i1<-match(1, colm)
colm[i1]<- colm[i]
colm[i]<-1
return(colm)
}
for(i in 1:nrow(DF))
{
DF[,i]=fn(DF[,i])
}
编辑
虽然这个答案在重读时被接受了(所以我不能删除)但我认为它没有完全按照你的要求做...
下面的代码应该可以解决这个问题..
DF<-read.table(text="A B C D
13 0 0 1
1 0 1 10
0 2 1 15
1 1 0 11", header=T)
rem<-1:nrow(DF)
for(i in 1:nrow(DF))
{
temp<-DF[i,]
any1<-intersect(rem, which(DF[,i]==1))
best1<-which.min(rowSums(DF[any1,]==1))
firsti<-any1[best1]
DF[i,]<-DF[firsti,]
DF[firsti,]<-temp
rem<-setdiff(rem, i)
}
DF
A B C D
1 1 0 1 10
2 1 1 0 11
3 0 2 1 15
4 13 0 0 1
很抱歉造成混淆。