【问题标题】:R diagonal matrix errorR 对角矩阵误差
【发布时间】:2018-08-10 13:18:27
【问题描述】:

我有以下类型的数据框

   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,])} })

我无法获得所需的输出。
(以上代码链接-Arrange data frame in a specific way

我请求有人指导我。数据框是一个小样本,但我有一个结构相似的大样本。

【问题讨论】:

  • 不是df1[order(df1$A),]
  • 你的输入和预期的输出有什么联系?
  • 我已经进行了编辑。请看一下。道歉。
  • 对角线应该是一。
  • 相同的代码是否适用于大型数据集。我希望用对角线填充。

标签: r diagonal permute


【解决方案1】:

只要每个合适的列中至少有一个 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

对于混淆,我深表歉意。

【讨论】:

  • @斯蒂芬·亨德森。先生。组合爆炸会减慢系统时间。如果我是正确的
  • 是的,在 10000 列上,置换解决方案将无法及时或在内存中起作用。如果您希望它稍微随机一点,则可以将匹配行替换为sample(which(colm==1),1),如果存在多个 1,它将随机选择一个 1。
猜你喜欢
  • 1970-01-01
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多