2013-03-05 105 views
0

我有一個大的數據框在R組成的4列和數千行。 這裏是第一線作爲一個例子:如何將列中的值與使用R的列中的值進行比較?

 ID  V1  V2  Stimulus 
[1,] 001 74.80 803.0 0 
[2,] 001 75.98 790.9 0 
[3,] 001 75.95 791.1 0 
[4,] 001 65.70 918.7 0 
[5,] 001 59.63 1005.6 13 
[6,] 001 59.44 1012.0 13 
[7,] 001 59.62 1010.0 13 
[8,] 001 63.85 942.4 13 
[9,] 001 60.75 992.9 0 
[10,] 001 59.62 1010.0 0 
[11,] 001 61.68 974.0 0 
[12,] 001 65.21 921.4 15 
[13,] 001 59.23 1012.0 15 
[14,] 001 61.23 979.5 15 
[15,] 001 70.80 849.2 0 

在該數據幀的每個行對應於1秒。列4(刺激)是0(即無刺激)或大於0的正整數(即刺激數)。激勵號碼總是由一個或多個0值分開)。

我想了解如何比較列4(刺激)中的每一個數值與前一行的值:從這個比較我想創建第5列在數據框中寫我「如果值爲0,則爲「PRE」;當值再次改變時(但僅針對前2行/秒),「OK」和其餘數字行不同於0的「POST」。

這是想什麼,我從以前的數據幀獲得

  ID  V1  V2  Stimulus Status 
    [1,] 001 74.80 803.0 0   PRE 
    [2,] 001 75.98 790.9 0   PRE 
    [3,] 001 75.95 791.1 0   PRE 
    [4,] 001 65.70 918.7 0   PRE 
    [5,] 001 59.63 1005.6 13   OK 
    [6,] 001 59.44 1012.0 13   OK 
    [7,] 001 59.62 1010.0 13   POST 
    [8,] 001 63.85 942.4 13   POST 
    [9,] 001 60.75 992.9 0   PRE 
    [10,] 001 59.62 1010.0 0   PRE 
    [11,] 001 61.68 974.0 0   PRE 
    [12,] 001 65.21 921.4 15   OK 
    [13,] 001 59.23 1012.0 15   OK 
    [14,] 001 61.23 979.5 15   POST 
    [15,] 001 70.80 849.2 0   PRE 

注意,行7,8和14我有值「POST」(OK價值歸因只是一個例子當檢測到從0值變化時的前2行)。

我不知道如何解決這個問題。我的想法如下: 我應該在數據框的第4列循環播放每一行。對於每一行 我應該檢查它是否比前一行更大

mydataframe$Stimulus[i,4] > mydataframe$Stimulus[i-1,4] 

如果是這樣我添加值「OK」新列,但只是第2行,那麼我想補充列5(狀態)中的值「POST」直到列4(刺激)的值變爲零。

我想要創建的第5列也可以是一個單獨的一列數據框,其行數與原始數據幀的行數相同。沒關係,我可以在原始數據幀處和原始數據幀處。

我的(理論)方法很好嗎?有沒有更簡單的方法來實現這一目標?

回答

2

首先,創建新的柱上進行(dat是你的數據集的名稱):

Status <- ave(dat[ , "Stimulus"], c(0, cumsum(abs(diff(dat[ , "Stimulus"])))), 
       FUN = function(x) 
         if(!x[1]) "PRE" else c(rep("OK", min(2, length(x))), 
              rep("POST", length(x) - 2))) 

現在,結合這兩個對象:

cbind(dat, Status) 

結果:

 ID V1  V2 Stimulus Status 
[1,] 1 74.80 803.0  0 PRE 
[2,] 1 75.98 790.9  0 PRE 
[3,] 1 75.95 791.1  0 PRE 
[4,] 1 65.70 918.7  0 PRE 
[5,] 1 59.63 1005.6  13  OK 
[6,] 1 59.44 1012.0  13  OK 
[7,] 1 59.62 1010.0  13 POST 
[8,] 1 63.85 942.4  13 POST 
[9,] 1 60.75 992.9  0 PRE 
[10,] 1 59.62 1010.0  0 PRE 
[11,] 1 61.68 974.0  0 PRE 
[12,] 1 65.21 921.4  15  OK 
[13,] 1 59.23 1012.0  15  OK 
[14,] 1 61.23 979.5  15 POST 
[15,] 1 70.80 849.2  0 PRE 
+0

謝謝你太棒了!如果不是OK和POST,我想顯示一個從1開始的遞進數(例如1,2,3 ...),直到我遇到另一個0爲止,我會在else語句中放入什麼?我試過用[code] else rep(rownames(dat),length(x)))[/ code]它可以工作,但它給了我很多警告(在'split < - 。default'('* tmp *',g, value = lapply(split(x,...:要替換的項目數不是替換長度的倍數) – Albz 2013-03-05 16:14:11

+1

@Albz您可以用'seq(x)'替換'else'語句。 1到'x'的長度。 – 2013-03-05 17:53:08

+0

非常感謝 – Albz 2013-03-06 09:59:58

相關問題