2016-08-03 18 views
0

我試圖在數據集中使用變量的特定順序 - 化合價和 - 實質上將行復制並粘貼到新數據集中。因此,對於每個子ID,對於每個化合價= 0,如果下一個化合價= -1,則將該行復制到稱爲「序列」的新數據集。問題在於試用訂單是隨機的,所以每個子標識的順序是不同的(否則我至少可以根據試用編號寫出一個大的塊狀腳本)。我最初沒有提到的一件重要事情是:每個子標識的值都會有不同的數量,所以行數不是跨子標識的。重新組織數據以計算序列效應

正如數據看起來像一個例子:

SubID location valence reaction_time 
1  1  0  500 
1  1  -1  600 
1  0  1  400 
1  0  0  500 
2  1  1  700 
2  1  0  400 
2  0  -1  700 
2  0  0  400 

我在這種事情幾乎是一個初學者(我猜它需要一個循環?)和唐」 t有一個堅實的起點,所以任何幫助將非常感激。

謝謝!

回答

2

假設你的數據是d

out <- by(d, d$SubID, function(x) { 
    v <- x$valence 
    x[which(v[1:(length(v)-1)]==0 & v[2:(length(v))]==-1),] 
}) 
sequence <- do.call(rbind, out) 

結果:

> sequence 
    SubID location valence reaction_time 
1  1  1  0   500 
2  2  1  0   400 
+0

嗨,我想我看到(有點)腳本是如何工作的。但是我沒有提到的一件事是每個子標識的行數是不同的。我懷疑這就是爲什麼我得到這個錯誤?:'tapply(seq_len(79155L),list('factor(data $ SubID)'= integer(0))中的錯誤,: 參數必須具有相同的長度' – Mik

+0

嗯, (我試着通過修改你的玩具數據集來試試)長度(factor(data $ SubID))== nrow(data)'?(另外,我編輯了答案,因爲我剛剛意識到了因素...)'是無關的。) –

+0

'length(factor(data $ SubID))== nrow(data)'returns FALSE – Mik

1

我假設你想將你的data.frame分到第1和第6行。這裏是data.table解決方案。

# load library and change to data.table 
library(data.table) 
setDT(df) 

# subset 
df[valence==0 & shift(valence == -1, type="lead"), .SD, by=SubID] 
    SubID location valence reaction_time 
1:  1  1  0   500 
2:  2  1  0   400 

數據

df <- read.table(header=T, text="SubID location valence reaction_time 
1  1  0  500 
1  1  -1  600 
1  0  1  400 
1  0  0  500 
2  1  1  700 
2  1  0  400 
2  0  -1  700 
2  0  0  400") 
+0

你好,非常感謝你爲你的幫助 - 正如我在我上面的評論中提到的,我嘗試了你的腳本,但是它返回了4個cols的空data.table(0行):subID,location,valence,RT'你有沒有想過爲什麼會出現這種情況?謝謝! – Mik

+0

我嘗試了一些潛在的錯誤來源:價格是性格或因素,這兩個(令人驚訝的)工作沒有問題。重命名變量導致錯誤。我現在唯一能想到的就是你的數據沒有你正在尋找的模式。這些腳本適用於示例數據,對不對? – lmo

+0

得到它的工作!謝謝你,你的評論關於它沒有我尋找的模式提示我(有80,000個觀察結果可能性爲0)......另外一個超級初學者的錯誤 - csv被格式化爲價類(當然他們是阻止 - 通過審判重組固定它)。 – Mik