2016-04-11 78 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