2016-02-11 119 views
1

我有這樣一個data.frame。檢測變化的變量R

data.frame(color = c("G","G","G","R","R","R","R","R","R","R","G","G"), 
      trial = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4)) 

我想檢測何時color切換爲每個'試驗'。像這樣:

color trial swtch 
1  G  1  0 
2  G  1  0 
3  G  1  0 
4  R  2  1 
5  R  2  1 
6  R  2  1 
7  R  3  0 
8  R  3  0 
9  R  3  0 
10  R  3  0 
11  G  4  1 
12  G  4  1 

我知道如何用for循環完成此操作。但是有沒有一種簡單的方法可以在R中實現這一點。我認爲ave函數可能會有用。

+0

可以在彩色模式切換不止一次在每次試驗? –

回答

3

這裏的東西有點不同:

x <- interaction(dat,drop=TRUE) 
x <- factor(x, levels=unique(x)) 
levels(x)[] <- 0:1 
dat$swtch <- x 

# color trial swtch 
#1  G  1  0 
#2  G  1  0 
#3  G  1  0 
#4  R  2  1 
#5  R  2  1 
#6  R  2  1 
#7  R  3  0 
#8  R  3  0 
#9  R  3  0 
#10  R  3  0 
#11  G  4  1 
#12  G  4  1 
+0

我很喜歡這個......但是如果關卡的數量很奇怪,它會給出一個不太好的警告。有什麼辦法可以避免這種情況? –

+0

@CarlosAlberto - 警告就是這樣,一個警告,而不是一個錯誤。你可以'抑制威望(levels(x)[] < - 0:1)',但那樣會殺死代碼的簡單性。 – thelatemail

+0

同意...並且我喜歡這個代碼對於每個試驗中的許多交換機都是健壯的。 –

1

我們可以使用ave創建一個邏輯索引,比較'color'的相鄰元素,按'trial'分組,然後獲得cummax

with(df1, ave(c(FALSE,color[-1]!= color[-nrow(df1)]), 
       trial, FUN= cummax)) 
#[1] 0 0 0 1 1 1 0 0 0 0 1 1