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