我目前在R脚本中遇到somme困难,因为所需的条件在循环内增加。这是解释和示例。
想象一个带有1或0的10x10矩阵(LISTE或Meldungen)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 0 0 0 1 0 0 1 0 1
[2,] 1 0 0 0 1 0 1 0 0 1
[3,] 0 0 0 1 0 0 0 0 1 0
[4,] 1 0 1 0 0 0 0 0 1 1
[5,] 1 0 1 0 1 1 0 0 1 0
[6,] 0 1 1 1 0 1 1 1 0 1
[7,] 0 0 1 0 1 1 1 1 0 0
[8,] 1 1 1 0 0 0 1 1 1 0
[9,] 1 0 0 0 0 1 1 0 0 0
[10,] 1 1 1 0 1 0 1 0 1 0
我想在每次迭代时加载一个循环来加载这个数据库。并检查每一行和列(i行和j列)
第一次迭代 1.从j = 1开始到列数 如果i,1 = 1且i + 1,1 = 0则i + 2,1 = 0
2次迭代(包含原始数据库) 从j = 1开始到列数 如果i,1 = 1且i + 1,1 = 0且i + 2,1 = 0则i + 3,1 = 0
3次迭代(包含原始数据库) 如果i,1 = 1且i + 1,1 = 0且i + 2,1 = 0且i + 3,1 = 0则i + 4,1 = 0
等等
我尝试按照代码
for(p in 2:time){
LISTE_neu <- LISTE #load original database
if(p == 2){
for(i in 1:row_number){
for(j in (1+p):column_number)){
if(LISTE_neu[i,(j-p)]==1 & Meldungen_num[i,j-(p-1)]==0){LISTE_neu[i,j] <- 0}
}
}
LISTE_neu_2 <- LISTE_neu
}
if(p == 3){
for(i in 1:row_number){
for(j in (1+p):column_number){
if(LISTE_neu[i,(j-p)]==1 & Meldungen_num[i,j-(p-1)]==0 & Meldungen_num[i,(j-(p-2))]==0){LISTE_neu[i,j] <- 0}
}
}
LISTE_neu_3 <- LISTE_neu
}
}
然而此时它正在发挥作用。然而,输入这种增加的条件是非常痛苦的。
你知道如何让事情更简单吗?知道是否不清楚
答案 0 :(得分:0)
编辑:只是为了澄清......问题当前表明,在列中,如果第一个条目为1
且所有后续条目直至p
为0
,则{ {1}}应为p+1
。每个0
都应该生成自己的数据框,因此我们得到p
个数据框。
Edit2:根据更清晰的愿望更新。
p
使用lis <- list()
for (p in 2:9){
LISTE_neu <- LISTE
met <- LISTE_neu[1,] == 1 & colSums(Meldungen_num[2:p,]) == 0
LISTE_neu[p+1,met] <- 0
lis[[p]] <- LISTE_neu
}
来调用结果,因此lis[[p]]
使用p = 2
。
解释:基本上,当lis[[2]]
增加时,您希望查看p
的更大部分,并查看所有值是否为Meldungen_num
。由于所有值都必须为0
,因此它们的总和也必须为0
。因此,我将所有感兴趣的值(0
)和它们(Meldungen_num[2:p,]
)相加。请注意,所有列同时发生这种情况(因此我们获得的数量与列数一样多)。然后我将所有这些比较为0,并且每个列分别得到答案。这样一条线就可以同时检查给定colSums
的所有列。 p
然后包含哪些列符合您的条件。
然后,我只使用met
将0
写入符合我们条件的列。然后,我将此新表存储在列表LISTE_neu[p+1,met] <- 0
中,然后转到下一个lis
。