Stackoverflow 并不是真的用于教程,因此请务必查看有关data.table
. 该网站是一个好的开始,关于 SO 上的软件包有很多问题,几乎涵盖了所有内容。
在这里,我只想向您展示如果您习惯了包的语法,它是多么容易。
首先,让我们加载包并读入您的数据:
library(data.table)
str <- "date subject trialn blockcode trialtype latency response correct
32913 15 1 practice taskswitch 1765 205 1
32913 15 2 practice cueswitch 4372 203 1
32913 15 3 practice cuerepetition 2523 203 0
32913 15 1 test cueswitch 2239 205 1
32913 15 2 test cuerepetition 1244 203 1
32913 15 3 test taskswitch 1472 203 0
32913 15 4 test cueswitch 1877 205 1
32913 15 5 test taskswitch 2271 203 1
30413 16 1 practice taskswitch 1377 203 1
30413 16 2 practice taskswitch 1648 203 1
30413 16 3 practice cueswitch 1181 205 1
30413 16 1 test cueswitch 1045 205 1
30413 16 2 test cuerepetition 969 203 0
30413 16 3 test cueswitch 857 203 1
30413 16 4 test taskswitch 1038 205 1
30413 16 5 test cuerepetition 836 203 0"
DT <- as.data.table(read.table(text=str, header=TRUE))
现在,这是您要求的一件事:
仅查看“测试”试验,对于每个独特的受试者,计算试验总数、延迟(即反应时间)低于 300 毫秒的试验数、平均延迟平均正确(即准确度)。
DT[blockcode=="test",
list(TotalNr = .N,
NrTrailLat = sum(latency < 300),
MeanLat = mean(latency),
MeanCor = mean(correct)),
by="subject"]
subject TotalNr NrTrailLat MeanLat MeanCor
1: 15 5 0 1820.6 0.8
2: 16 5 0 949.0 0.6
基本上,通过这几行代码,我可以回答所有这些问题。在我看来,语法也很简单。对于我们来说DT
,我们只想看看观察在哪里blockcode=="test"
。接下来,我们要分别为每个主题运行所有分析。这很容易通过by="subject"
声明完成。很酷的事情:如果要拆分几个维度,只需添加它们...与其忽略实践,让我们分别看一下:
DT[,
list(TotalNr = .N,
NrTrailLat = sum(latency < 300),
MeanLat = mean(latency),
MeanCor = mean(correct)),
by="subject,blockcode"]
subject blockcode TotalNr NrTrailLat MeanLat MeanCor
1: 15 practice 3 0 2886.667 0.6666667
2: 15 test 5 0 1820.600 0.8000000
3: 16 practice 3 0 1402.000 1.0000000
4: 16 test 5 0 949.000 0.6000000
现在不要告诉我这不可怕!
让我们尝试另一个:
此外,创建包含日期和 subjectID 的最后(或第一个)值的变量(这是为了将数据和 subjectID 放在新的数据框中)。
我不确定你在这里的意思是什么,因为date
你的每个主题的例子都没有改变。所以让我们让它更难一点。假设我们想知道subject,blockcode
第一次试验的每个组合的延迟。为此,我们应该首先进行排序DT
,以便我们知道第一个trialn
始终为 1。(对于此示例数据,这并不是真正必要的,因为它似乎已经排序)。
setkey(DT, subject, blockcode, trialn)
DT[, list(FirstLat = latency[1]) , by="subject,blockcode"]
subject blockcode FirstLat
1: 15 practice 1765
2: 15 test 2239
3: 16 practice 1377
4: 16 test 1045
但是,您想将此作为新列添加到DT
. 为此,您可以使用:=
运算符:
DT[, FirstLat := latency[1] , by="subject,blockcode"]
DT
date subject trialn blockcode trialtype latency response correct FirstLat
1: 32913 15 1 practice taskswitch 1765 205 1 1765
2: 32913 15 2 practice cueswitch 4372 203 1 1765
3: 32913 15 3 practice cuerepetition 2523 203 0 1765
4: 32913 15 1 test cueswitch 2239 205 1 2239
5: 32913 15 2 test cuerepetition 1244 203 1 2239
6: 32913 15 3 test taskswitch 1472 203 0 2239
7: 32913 15 4 test cueswitch 1877 205 1 2239
8: 32913 15 5 test taskswitch 2271 203 1 2239
9: 30413 16 1 practice taskswitch 1377 203 1 1377
10: 30413 16 2 practice taskswitch 1648 203 1 1377
11: 30413 16 3 practice cueswitch 1181 205 1 1377
12: 30413 16 1 test cueswitch 1045 205 1 1045
13: 30413 16 2 test cuerepetition 969 203 0 1045
14: 30413 16 3 test cueswitch 857 203 1 1045
15: 30413 16 4 test taskswitch 1038 205 1 1045
16: 30413 16 5 test cuerepetition 836 203 0 1045
所以这些只是让你开始的一些想法。我之所以这样做,是因为我想向您展示,当您了解基础知识后,大多数事情都会变得非常容易。这应该是通过手册完成它的动力,这在开始时可能有点矫枉过正。但这是值得的,相信我!因为我什至没有提到最好的部分:data.table
也非常快。祝你分析顺利。