2016-04-11 46 views
0

我有5个变量的数据框。每当它们中的一个(树,变量3)发生变化时,我需要拉动整行并将其放置到一个新对象中。问题是我不知道任何逻辑运算符的值是从一行变到另一行。所以我完全期待一个错误,并得到了这个错误。这是我想出了这样做的代码:R中的矩阵表示法中的逻辑运算符

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循环。基本上,我需要的是知道第三个变量在r2和r3之间变化的情况,它应该将r3(dat1中的第三行)粘贴到一个新的对象中。

回答

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 
+0

这不会粘贴出我需要的东西。它用NA代替值。我需要拉整行并保存。基本上,每次“树”变化时,我都需要知道整行的值。所以我需要知道r3中的内容,而且我真的只有部分数据。 – KathleenJ

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,] 
+0

这是完美的!非常感谢! – KathleenJ