我有几个主题参加了三个会话-他们执行了一项任务,给了我几次响应时间。这是我的数据的模拟样本:
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进行数据整理,但是我愿意接受任何答案。
答案 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]
进行子集化。)