Сравнение 2 наборов данных, чтобы сохранить только участников, которые завершили 75% испытаний с использованием R - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть большой набор данных, где участники завершили испытания задачи. Есть 100 регулярных испытаний и 10 тренировочных испытаний. Для этой задачи мы хотим только сохранить испытания, которые люди получили правильно. Я сделал отдельный набор данных, который содержит мои данные без выбросов и неправильных испытаний. Теперь я застрял, потому что мне нужно найти способ сохранить только тех участников, у которых по крайней мере 75% их данных.

Чтобы упростить, а не публиковать весь большой набор данных, это выглядит примерно так:

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

Таким образом, предметы находятся в одном столбце, а их задержка - в другом столбце. Второй набор данных меньше, потому что испытания были удалены. Я действительно не мог найти хороший способ сравнить 2 набора данных и сохранить только идентификаторы субъектов, которые сохранили 75% или более их данных.

Спасибо всем!

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Вот простое 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
0 голосов
/ 12 сентября 2018

Если ваши два набора данных называются 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...