比较2个数据集,以仅保留使用R完成75%试验的参与者

时间:2018-09-12 17:56:47

标签: r

我有一个很大的数据集,参与者在其中完成了一项任务的试验。有100次常规试验和10次实践试验。对于此任务,我们只想保留人们正确的尝试。我制作了一个单独的数据集,其中包含我的数据,没有异常值和错误的试验。现在,我被困住了,因为我需要找到一种方法来仅保留仍然拥有至少75%数据的参与者。

为简化而不是发布整个大型数据集,它看起来像这样:

subject latency 
0003     454
0003     500
0003     600
0004     457
0004     600
0005     700

因此,受试者位于一列中,而潜伏期则位于另一列中。第二个数据集较小,因为删除了试验。我真的找不到比较两个数据集的很好的方法,只能保留保留其数据的75%或更多的主题ID。

谢谢大家!

2 个答案:

答案 0 :(得分:1)

如果您的两个数据集分别称为dt1dt2

首先找到每个主题的试验次数,然后合并之前和之后的表:

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