原始问题已被删除
亲爱的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
你能帮帮我吗?
此致 灰
答案 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