如何有条件地删除循环中的矩阵行

时间:2014-02-24 08:45:39

标签: r

我有一个名为d的矩阵。

这是d矩阵

     V1    V2       V3       V4
1    I     14.06863 11.50424 333173.1
2    N     14.50265 11.89501 387709.7
3    I     14.55234 11.95746 402124.0
4    I     14.78606 12.14149 453059.3
5    N     15.16970 12.51004 496142.1
6    D     14.41104 11.81296 539661.3
7    D     14.86976 12.23968 603475.4

我找到了

d$Delta_Cost <- c(0, diff(d[, 4]))
d$Delta_LY <- c(0, diff(d[, 2]))

我需要遍历矩阵并删除满足此条件的行

Delta_Cost>0 & Delta_LY<0

但我不知道如何在R中这样做。

谢谢!

1 个答案:

答案 0 :(得分:1)

以下是您的数据的可重现版本:

d <- read.table(
  text = "
     V1    V2       V3       V4
1    I     14.06863 11.50424 333173.1
2    N     14.50265 11.89501 387709.7
3    I     14.55234 11.95746 402124.0
4    I     14.78606 12.14149 453059.3
5    N     15.16970 12.51004 496142.1
6    D     14.41104 11.81296 539661.3
7    D     14.86976 12.23968 603475.4",
  header = TRUE
)

由于您希望循环的内容至少运行一次,因此您希望repeat循环而不是while循环。 to_remove是一个逻辑向量,只要您想删除该行,就会TRUE。如果没有要移除的行if(!any(to_remove)),我们就会突破循环。

repeat
{    
  Delta_Cost <- c(0, diff(d[, 4]))
  Delta_LY <- c(0, diff(d[, 2]))    
  to_remove <- Delta_Cost > 0 & Delta_LY < 0 
  if(!any(to_remove))
  {
    break
  }
  d <- d[!to_remove, ]
}
d
##   V1       V2       V3       V4
## 1  I 14.06863 11.50424 333173.1
## 2  N 14.50265 11.89501 387709.7
## 3  I 14.55234 11.95746 402124.0
## 4  I 14.78606 12.14149 453059.3
## 5  N 15.16970 12.51004 496142.1