我有一个数据集(称为 eyeData ),在很短的版本中如下所示:
sNumber runningTrialNo wordTar
1 1 vital
1 1 raccoon
1 1 vital
1 1 accumulates
1 2 tornado
1 2 destroys
1 2 tornado
1 2 destroys
1 2 property
4 51 denounces
4 51 brings
4 51 illegible
4 51 frequently
4 51 brings
4 61 cerebrum
4 61 vital
4 61 knowledge
4 61 vital
4 61 cerebrum
我写了一个循环来分别删除每个试用版的 wordTar 列的所有重复项(相同的单词),因此数据看起来像这样:
sNumber runningTrialNo wordTar
1 1 vital
1 1 raccoon
1 1 accumulates
1 2 tornado
1 2 destroys
1 2 property
4 51 denounces
4 51 brings
4 51 illegible
4 51 frequently
4 61 cerebrum
4 61 vital
4 61 knowledge
4 61 cerebrum
以下是代码:
for (sno in eyeData$sNumber) {
for(trial in eyeData$runningTrialNo) {
ss <- subset(eyeData, sNumber == sno & runningTrialNo == trial)
ss.s <- ss[!duplicated(ss$wordTar), ]
}
}
然而,它运行了很长时间,所以我关闭它...因为我是R环境的新手,我的猜测是我做了一个循环错误。有没有办法改善我的循环,所以它会给我一个理想的输出?
答案 0 :(得分:1)
在R中,For循环通常较慢。通常需要vectorize your code。有很多方法可以做,这是使用库dplyr
:
library(dplyr)
eyeData %>% group_by(runningTrialNo) %>%
distinct(wordTar)
使用microbenchmark
我们可以看到更快,更快,我们运行代码100次并查看需要多长时间:
library(microbenchmark)
microbenchmark(dplyr = eyeData %>% group_by(runningTrialNo) %>%
distinct(wordTar),
old = for (sno in eyeData$sNumber) {
for(trial in eyeData$runningTrialNo) {
ss <- subset(eyeData, sNumber == sno & runningTrialNo == trial)
ss.s <- ss[!duplicated(ss$wordTar), ]
}
})
Unit: milliseconds
expr min lq mean median uq max neval
dplyr 1.256438 1.287158 1.567518 1.495092 1.550579 12.29212 100
old 102.203029 110.265423 112.664063 111.789698 113.166710 304.58312 100