R中矩阵表示法内的逻辑运算符

时间:2016-04-11 20:19:05

标签: r matrix logical-operators

我有一个包含5个变量的数据框。每当其中一个(树,变量3)发生变化时,我需要拉动整行并将其放入一个新对象中。问题是当值从一行变为下一行时,我不知道任何逻辑运算符。所以我完全期待一个错误,并得到了这个错误。这是我提出的代码:

dat1<-read.csv("filepath", header=T) #Reads in file

dat<-NULL #Creates null object for for loop below

dat1<-as.matrix(dat1) #Code below only "works" on matrices

for (i in 2:198025) { if(dat1[i,3]-dat1[i-1,3]!=0){dat[i,]=dat1[i,]} } #Supposed to compare the row, i with the value of the row above.

我尝试进行减法,因为如果行之间的差异不是0,那么这意味着该值必须已更改。问题是R不喜欢矩阵表示法中的逻辑表达式。除了一些冗长的线性组合以找到唯一值之外,我想不出有任何其他方法可以做到这一点,我知道必须有更好的方法。

以下是一些示例数据

r1<- c(1,2,1,4,5)
r2<- c(1,3,1,5,6)
r3<- c(1,4,2,5,6)
r4<- c(1,4,2,6,7)
dat1<- rbind(r1,r2,r3,r4)

这不是实际数据,但您可以使用它来测试for循环。基本上,我需要知道的是,因为第3个变量在r2和r3之间变化,所以它应该将r3(dat1中的第三行)粘贴到一个新对象中。

2 个答案:

答案 0 :(得分:0)

这应该做你想要的,它避免使用显式循环:

> ifelse(rbind(-1, apply(dat1, 2, diff)) == 0, dat1, NA)
   [,1] [,2] [,3] [,4] [,5]
     NA   NA   NA   NA   NA
r2    1   NA    1   NA   NA
r3    1   NA   NA    5    6
r4    1    4    2   NA   NA

答案 1 :(得分:0)

这是一种比较向量的相邻元素以检查它们是否相同的方法,然后保留data.frame的行,其中该向量的元素与前面的元素不匹配:

# Let's say the third variable is the one of interest
myVec <- dat1[, 3]
# Now, create two vectors that have one element removed
myVecNoFirst <- myVec[-1]
myVecNoLast <- myVec[-length(myVec)]

# now check for changes, add one to the index to get the proper row
keepers <- which(myVecNoFirst != myVecNoLast) + 1
# keep the rows where a change occurred
datKeepers <- dat1[keepers,]