如何删除R

时间:2018-08-31 17:21:02

标签: r dplyr

我有几个主题参加了三个会话-他们执行了一项任务,给了我几次响应时间。这是我的数据的模拟样本:

  Subject Session  Trial  Stim.ACC  Stim.OnsetTime Stim.RT
  1       1        1      1         1              700
  1       1        2      0         2              392
  1       1        3      1         3              322
  1       1        4      1         4              327
  1       1        5      1         5              403
  1       1        6      1         6              388
  1       1        7      1         7              328
  1       1        8      1         8              374
  1       2        1      1         1              700
  1       2        2      0         2              392
  1       2        3      1         3              322
  1       2        4      1         4              327
  1       2        5      1         5              403
  1       2        6      1         6              388
  1       2        7      1         7              328
  1       2        8      1         8              374

我想知道是否有一种方法可以根据会话号和主题号删除整个行。即。我要摆脱主题1的第一次会议,而不是第二次会议。

类似地,我想知道是否可以使用要删除的主题/课程的矩阵,以便我可以一次完成所有操作。例如,一次全部删除subject1session1,subject10session3,subject12session2,subject4session2等。

我通常使用dplyr和tidyr进行数据整理,但是我愿意接受任何答案。

2 个答案:

答案 0 :(得分:1)

我们通过'Subject'分组,filter将不等于first'Session'的'Session'删除,以删除不是每个'Subject'的起始'Session'的所有行

library(dplyr)
df1 %>% 
    group_by(Subject) %>% 
    filter(Session != first(Session))

如果OP希望删除每个“主题”的第一行

df1 %>%
    group_by(Subject) %>%
    slice(-1)

答案 1 :(得分:0)

以下是最后一段的潜在解决方案:

  library(tidyverse)
  set.seed(1234)

  df <- as.data.frame(cbind(rep(1,16),
                      cbind(rep(1:2,each = 8),
                      cbind(rep(1:8,2)),
                      cbind(sample(c(1,0),16,T),
                      cbind(rep(1:8,2),
                      sample(300:800,16))))))

  names(df) <- c("Subject","Session","Trial","Stim.ACC","Stim.OnsetTime","Stim.RT")

...创建此data.frame

     Subject Session Trial Stim.ACC Stim.OnsetTime Stim.RT
  1        1       1     1        0              1     399
  2        1       1     2        1              2     730
  3        1       1     3        1              3     498
  4        1       1     4        0              4     376
  5        1       1     5        0              5     468
  6        1       1     6        0              6     482
  7        1       1     7        0              7     511
  8        1       1     8        0              8     392
  9        1       2     1        1              1     624
  10       1       2     2        1              2     752
  11       1       2     3        1              3     660
  12       1       2     4        1              4     732
  13       1       2     5        1              5     766
  14       1       2     6        1              6     395
  15       1       2     7        1              7     530
  16       1       2     8        0              8     487

创建一个bad data.frame或矢量:

 bad <- unite(data.frame(rbind(c(1,1),rbind(c(10,3),rbind(c(12,2),c(4,2))))))

 1  1_1
 2 10_3
 3 12_2
 4  4_2

每对都是一个主题和一个会话。您也可以将其设为向量。

 bad <- c("1_1","10_3","12_2","4_2")

然后创建一个“错误代码”列并进行过滤:

 df %>%
    unite(col = "badcode",c(Subject,Session),remove = F) %>%
    filter(!(badcode %in% bad[,1]))

创建不良主题和会话对的列表,然后使用最后一行按该列表过滤(如果它是向量,则不需要用[,1]进行子集化。)