【发布时间】:2016-12-04 09:41:32
【问题描述】:
我知道已经发布了很多问题,但我无法将解决方案应用于我的问题。
我有一个包含许多行和列的数据集。下面是一个示例:
V7 V8 V9
0 1 0
-1 1 -1
-1 1 -1
-1 0 -1
-1 0 -1
-1 0 -1
-1 0 -1
-1 1 -1
0 1 -1
0 1 -1
-1 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 -1 0
0 -1 -1
0 0 0
0 1 0
0 0 0
此数据保存在矩阵trboot3
我想做的是创建一个循环,检查两个条件并更改数据。
- 如果有零,跳到下一行。
- 如果连续有一个相同的数字,则保留第一个数字并将其余数字更改为零。
这是我上面循环的代码:
trboot4<-trboot3
valboot<-length(trboot3[,1])
for (k in 1:length(trboot3[1,])){
for (i in 2:valboot-1){
if (trboot3[k,i]==0) {i<-i+1}
else{
if(trboot3[k,i] == trboot3[k,i+1]){
for (j in i+1:valboot){ if(trboot3[k,j] == trboot3[k,i]){trboot4[k,j]<-0}else{break}
if(j==valboot){break}
}
}
}
}
}
我想将新矩阵保存在trboot4
基本上上面的示例应该变成:
V7 V8 V9
0 1 0
-1 0 -1
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 1 0
0 0 0
0 0 0
-1 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 -1 0
0 0 -1
0 0 0
0 1 0
0 0 0
【问题讨论】:
-
当前循环是否有效?如果有效,是不是太慢了?
-
嗨@digEmAll 没有错误除了
subscript out of bounds当前循环。但我的 trboot4 输出与 trboot3 相同。不,至少对我来说并不慢。 -
我提供了一个不使用循环的解决方案,顺便说一句,您可以使用 nrow 和 ncol 函数来获取矩阵的列数和行数,您不需要这样做:
length(m[,1])等...
标签: r loops if-statement