我有一个很大的数据集,参与者在其中完成了一项任务的试验。有100次常规试验和10次实践试验。对于此任务,我们只想保留人们正确的尝试。我制作了一个单独的数据集,其中包含我的数据,没有异常值和错误的试验。现在,我被困住了,因为我需要找到一种方法来仅保留仍然拥有至少75%数据的参与者。
为简化而不是发布整个大型数据集,它看起来像这样:
subject latency
0003 454
0003 500
0003 600
0004 457
0004 600
0005 700
因此,受试者位于一列中,而潜伏期则位于另一列中。第二个数据集较小,因为删除了试验。我真的找不到比较两个数据集的很好的方法,只能保留保留其数据的75%或更多的主题ID。
谢谢大家!
答案 0 :(得分:1)
如果您的两个数据集分别称为dt1
和dt2
:
首先找到每个主题的试验次数,然后合并之前和之后的表:
library(data.table)
setDT(dt1)
setDT(dt2)
dt3 <- merge(
dt1[, .N, subject],
dt2[, .N, subject],
by = "subject"
)
您要保留的主题是那些剩余的观测值大于0.75的主题:
subjToKeep <- dt3[, percRemaining := N.y / N.x][percRemaining >= 0.75, subject]
dt2[subject %in% subjToKeep]
答案 1 :(得分:1)
这是一个简单的dplyr
解决方案
# example of full dataset
df_full = data.frame(subject = c(1,1,1,1,2,2,2,2,3,3,3,3,4),
latency = 1:13)
# example of smaller dataset
df_small = data.frame(subject = c(1,2,2,2,3,3,3),
latency = c(2,5,6,7,8,10,12))
library(dplyr)
df_full %>% count(subject) %>% # count rows for each subject in full dataset
left_join(df_small %>% count(subject), by="subject") %>% # count rows for each subject in small dataset and join
filter(n.y / n.x >= 0.75) %>% # keep only subjects where we have 75% or more of their data
pull(subject) -> subj_vec # save the subjects as a vector
# use that vector to filter your smaller dataset
df_small %>% filter(subject %in% subj_vec)
# subject latency
# 1 2 5
# 2 2 6
# 3 2 7
# 4 3 8
# 5 3 10
# 6 3 12