根据前一行值(在同一列中)选择特定行

时间:2016-04-25 14:42:54

标签: r loops dataframe row

我一直试图想办法通过R来编写脚本,但却无法得到它。我有一个像这样的数据集:

Trial  Type Correct Latency     
1       55  0       0
3       30  1       766
4       10  1       344
6       40  1       716
7       10  1       326
9       30  1       550
10      10  1       350
11      64  0       0
13      30  1       683
14      10  1       270
16      30  1       666
17      10  1       297
19      40  1       616
20      10  1       315
21      64  0       0
23      40  1       850
24      10  1       322
26      30  1       566
27      20  0       766
28      40  1       500
29      20  1       230

持续时间更长(约1000行)。

从这一个数据集中,我想创建4个独立的data.frames / tables我可以导出表格以及进行自己的计算

我想有一个data.frame(总共4个),每个子弹点都有一个:

  • 键入10行,其前面是30行类型
  • 键入10行,其前面是类型40行
  • 键入20行,其前面是类型30行
  • 键入20行,其前面是类型40行

我希望将相关行中的所有列放入这些新表中,但仅包括行类型10或20的列信息。

例如,第一个表(类型10前面的类型30 )会根据示例数据这样做:

Trial  Type Correct Latency     
  4       10     1       344
  10      10     1       350
  14      10     1       270
  17      10     1       297

第二个表格(类型10,前面是类型40 ):

Trial    Type  Correct  Latency     
  7       10     1       326
  20      10     1       315
  24      10     1       322

第三个表格(类型20,前面是类型30 ):

Trial    Type  Correct  Latency     
  27      20     0       766

第四个表格(表格20以类型40开头):

Trial    Type  Correct   Latency        
 29      20      1        230

我可以通过子集来获得一个只有10行类型和另一个类型为20行的表,但我无法弄清楚如何根据以前的类型值为10和20行创建不同的表。此外,问题是“试验”不符合规定(跳过数字)。

非常感谢任何帮助。谢谢。

,还有办法包含前一行,所以第四个表的输出看起来像这样:

第四个表格(表格20以类型40开头):

Trial    Type  Correct   Latency        
 28      40      1        500
 29      20      1        230

2 个答案:

答案 0 :(得分:0)

对于第四个示例,您可以将which()lag()中的dplyr结合使用,以获得符合条件的索引。然后,您可以使用这些来对data.frame

进行子集化
# Get indices of rows that meet condition
ind2 <- which(df$Type==20 & dplyr::lag(df$Type)==40)
# Get indices of rows before the ones that meet condition
ind1 <- which(df$Type==20 & dplyr::lag(df$Type)==40)-1

# Subset data
> df[c(ind1,ind2)]
   Trial Type Correct Latency
1:    28   40       1     500
2:    29   20       1     230

答案 1 :(得分:0)

如果您始终要删除数据的首次试用,请参阅以下示例代码。

var1 <- c(1,2,1,2,1,2,1,2,1,2)
var2 <- c(1,1,1,2,2,2,2,3,3,3)

dat <- data.frame(var1, var2)

var1 var2
1     1    1
2     2    1
3     1    1
4     2    2
5     1    2
6     2    2
7     1    2
8     2    3
9     1    3
10    2    3

#delete only this line directly
filter(dat,lag(var2)==var2)

var1 var2
1     1    1
2     2    1
3     1    1
6     2    2
7     1    2
10    2    3

#delete the first 2 trials
#make a list of all rows where var2[n-1]!=var2[n] --> using lag from dplyr
drops <- c(1,2,which(lag(dat$var2)!=dat$var2), which(lag(dat$var2)!=dat$var2)+1)
if (!identical(drops,numeric(0))) { dat <- dat[-drops,] }

var1 var2
3     1    1
6     2    2
7     1    2
10    2    3