如何使用R将列中的值与前一列中的值进行比较?

如何使用R将列中的值与前一列中的值进行比较?,r,R,我在R中有一个由4列和数千行组成的大型数据帧。 以下是第一行作为示例: 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

我在R中有一个由4列和数千行组成的大型数据帧。 以下是第一行作为示例:

     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”,当值更改时写入“OK”(但仅限于前2行/秒)和“POST”对于与0不同的其余数值行,再次显示新的0值

这是我想从前面的数据帧中获得的一个示例

         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”(当检测到值0的变化时,OK值仅归属于前两行)

我不知道如何解决这个问题。我的想法如下: 我应该循环遍历数据帧第4列中的每一行。每行我 我应该检查它是否大于上一行

 mydataframe$Stimulus[i,4] >  mydataframe$Stimulus[i-1,4]
如果是这样,我将值“OK”添加到新列中,但仅针对前2行,然后我将在第5列(状态)中添加值“POST”,直到第4列(刺激)的值变为零

我想要创建的第5列也可以是一个单独的单列数据帧,其行数与原始数据帧相同。不要紧,我可以在和处找到它,并将其绑定到原始数据帧


我的(理论)方法好吗?有没有更简单的方法来实现这一点?

首先,创建新列(
dat
是数据集的名称):

结果是:

      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

非常感谢,它工作得很好!如果我想显示一个从1开始的累进数(例如1,2,3…),直到遇到另一个0,而不是OK和POST,我会在else语句中添加什么?我尝试了[code]else rep(rownames(dat),length(x))[/code]它可以工作,但是它给了我很多警告(在
split@Albz您可以用
seq(x)
替换
else
语句。这将生成一个从1到
x
长度的序列。
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