根据列条目从矩阵中删除行

时间:2016-02-22 06:11:01

标签: r matrix

原始问题已被删除

亲爱的R用户,

我有一个关于从矩阵中删除行的问题。所有矩阵条目都是0或1.行根据行总和进行排序。

这是一个示例矩阵

e1  <- c(0,0,0,1,0,0,0)
e2  <- c(1,0,0,0,0,0,0)
e3  <- c(0,1,0,0,0,0,0)
e4  <- c(0,0,1,0,1,0,0)
e5  <- c(1,1,0,0,0,0,0)
e6  <- c(1,0,0,0,1,0,0)
e7 <- c(0,0,0,0,0,1,1)
e8 <- c(0,0,0,0,1,0,1)
e9  <- c(0,0,1,0,1,1,0)
e10  <- c(0,0,1,0,1,0,1)
e11 <- c(0,0,0,0,1,1,1)
e12  <- c(1,1,0,1,1,0,0)
e13 <- c(0,0,1,1,0,1,1)


(E <- rbind(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13))

打印

> (E <- rbind(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10, e11, e12, e13))
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
e1     0    0    0    1    0    0    0
e2     1    0    0    0    0    0    0
e3     0    1    0    0    0    0    0
e4     0    0    1    0    1    0    0
e5     1    1    0    0    0    0    0
e6     1    0    0    0    1    0    0
e7     0    0    0    0    0    1    1
e8     0    0    0    0    1    0    1
e9     0    0    1    0    1    1    0
e10    0    0    1    0    1    0    1
e11    0    0    0    0    1    1    1
e12    1    1    0    1    1    0    0
e13    0    0    1    1    0    1    1

我想以下列方式删除行。如果一行有一个1,那么下面的所有后续行应删除该列中的1。因此我们观察行e1 e2和e3可以连续删除行e5,e6,e12和e13。给我们留下行e1,e2,e3,e4,e7,e8,e9,e10和e11。

for (v in 2:dim(E)[1])
{
print(v)
print(E[v, 4])
if (E[v, 4] == 1) E <- E[-v,]   
}

删除for循环中的行会给我一个错误。所以我想我会首先找到行(如果有的话)有一个rowum 1并识别它们。然后我尝试使用for循环删除该位置为1的以下行。再次出错。

UnitRowsum <- E[which(rowSums(E) == 1),]
UnitRowsum

for (v in 1:dim(UnitRowsum)[1])
{
print(which(UnitRowsum[v, ] == 1))
}

此外,我希望基于总和大于1的行继续行删除,并删除所有这些位置中包含1的所有后续行,依此类推。举个例子,我的意思是首先我会有一个简化的矩阵

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
e1     0    0    0    1    0    0    0
e2     1    0    0    0    0    0    0
e3     0    1    0    0    0    0    0
e4     0    0    1    0    1    0    0
e7     0    0    0    0    0    1    1
e8     0    0    0    0    1    0    1
e9     0    0    1    0    1    1    0
e10    0    0    1    0    1    0    1
e11    0    0    0    0    1    1    1

首先,我们从包含rowsum 1的行开始,然后删除所有后续行,并在该位置使用1。完成后,我们会看到是否有任何行,其中包含rowsum 2。是的,我们继续搜索在这两个位置都有1的所有行并删除所有这些行。在此之后,我们转到带有rowum 3(如果有的话)的行并继续进行,直到我们到达一个没有行占优势的矩阵。

行e4支配行e9和e10,因此必须删除。行e8在行e11中占主导地位,因此也必须将其删除。这种情况一直持续到无法删除更多行。最终我想得到矩阵

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
e1     0    0    0    1    0    0    0
e2     1    0    0    0    0    0    0
e3     0    1    0    0    0    0    0
e4     0    0    1    0    1    0    0
e7     0    0    0    0    0    1    1
e8     0    0    0    0    1    0    1

你能帮帮我吗?

此致 灰

2 个答案:

答案 0 :(得分:0)

以下是我提出的可以解决的一个解决方案:

[HttpGet]
public JsonResult UploadFile()
    {
        string _imgname = string.Empty;
        if (System.Web.HttpContext.Current.Request.Files.AllKeys.Any())
        {
            var pic = System.Web.HttpContext.Current.Request.Files["MyImages"];
            if (pic.ContentLength > 0)
            {
                var fileName = Path.GetFileName(pic.FileName);
                var _ext = Path.GetExtension(pic.FileName);

                _imgname = Guid.NewGuid().ToString();
                var _comPath = Server.MapPath("/MyFolder") + _imgname + _ext;
                _imgname = "img_" + _imgname + _ext;

                ViewBag.Msg = _comPath;
                var path = _comPath;
                tblAssignment assign = new tblAssignment();
                assign.Uploaded_Path = "/MyFolder" + _imgname + _ext;
                // Saving Image in Original Mode
                pic.SaveAs(path);
            }
        }
        return Json(Convert.ToString(_imgname), JsonRequestBehavior.AllowGet);
    }

您可以测试这些部分中的每一部分,看看发生了什么。

这给出了矩阵的每一列中出现1的行列​​表:

E[!row.names(E) %in% unique(unlist(apply(E, 2, function(x) names(x[x == 1][2:length(x[x == 1])])))), ]

这给出了在第一次出现矩阵列之后出现1的行列​​表:

apply(E, 2, function(x) names(x[x == 1]))

这样可以获得有资格删除的唯一行号:

apply(E, 2, function(x) names(x[x == 1][2:length(x[x == 1])]))

然后最后一步是使用过滤/子集来删除这些行。

您可以通过编写一个小的自定义函数来提取unique(unlist(apply(E, 2, function(x) names(x[x == 1][2:length(x[x == 1])])))) 来简化代码,并通过不调用apply两次来优化一点。但是......希望这会有所帮助。

答案 1 :(得分:0)

#This seems to do the trick (Thanks Cody)

test = E
for (i in (nrow(E)-1):1)
 {
  if (sum(E[i,]) == 0)
  {
    test = test[-c(i),]
    next
   }
 for (j in (nrow(test): (i)))
 {
   if ((j>nrow(test)) | (j==i))
    {break}
   if (sum(xor(E[i,],test[j,])*1) == (sum(test[j,]) - sum(E[i,])))
   {
      print(c(i,j))
      test = test[-c(j),]
    }
  }
 }

 E = test

 E