Как извлечь определенные интервалы из набора данных?

У меня есть большой набор данных (более 200 тысяч строк и тысяча испытаний) с четырьмя столбцами со следующей информацией:

  • "Испытания": порядковый номер)
  • "Is.Check": столбец с 1 для чеков и 0 для не чеков
  • "ID": столбец с названием чека или строки (не чеки)
  • "Реакция": переменная ответа

Мне нужно знать, какие строки (обозначенные буквой "L" + число ") находятся между наибольшим и меньшим значением проверок в каждом испытании. Например, в испытании 10001 у меня есть 5 проверок, самая большая - проверка 3 (реакция = 56) и меньший чек 1 (Реакция = 50). Мне нужно знать, какие линии остаются между этими двумя значениями, т. Е. (Больше или равно 50 и мало или равно 56). Небольшой набор данных был прикреплен для примера. В этом, в в пробной версии 10001 должны быть выбраны все строки, кроме "L3". С другой стороны, в пробной версии 10002 меньшая проверка - это проверка-1 (50), а самая большая - проверка-7 (60), таким образом, только L3 и L9 должны быть Проверки и значения реакции меняются в каждом испытании, поэтому мне нужно извлечь строки со значениями между самым большим и меньшим проверками в каждом испытании.

Trials  Is.Check     ID       Reaction
10001   1            Check-1  50
10001   0            L1       50
10001   0            L2       50
10001   0            L10      50
10001   0            L9       50
10001   0            L6       50
10001   0            L3       48
10001   0            L4       50
10001   0            L8       50
10001   1            Check-5  52
10001   0            L7       50
10001   1            Check-2  52
10001   1            Check-4  54
10001   0            L5       52
10001   1            Check-3  56
10002   1            Check-1  50
10002   0            L1       48
10002   0            L2       48
10002   0            L3       54
10002   0            L4       64
10002   0            L5       64
10002   0            L6       62
10002   0            L7       62
10002   0            L8       70
10002   0            L9       52
10002   1            Check-7  60
10002   1            Check-2  54
10002   1            Check-6  56
10002   1            Check-3  54

1 ответ

Решение

В качестве первого шага вы хотите разделить data.frame, в соответствии с пробной версией:

splitted <- split(dataset, dataset$Trials)

Затем для каждого из этих элементов мы выбираем все непроверяемые элементы, которые удовлетворяют 2 условиям: >= самый маленький чек, и <= самый большой. И мы должны сделать это для каждого из под-data.frames в splittedпоэтому мы используем lapply, чтобы применить нашу функцию к каждому из sub-data.frames:

selection <- lapply(splitted, function(subdf) {
  subdf[subdf$Is.Check==0 &
        subdf$Reaction >= min(subdf$Reaction[subdf$Is.Check==1]) &
        subdf$Reaction <= max(subdf$Reaction[subdf$Is.Check==1])
       ,]

})

Выбор - теперь список с каждой проверкой выбора правильных не проверок. Если вы хотите объединить эти выборки в один большой data.frame, вы можете использовать bind_rows от dplyr-package

install.packages('dplyr') # If you don't have it yet
Fullselection <- dplyr::bind_rows(selection)

Если по какой-то причине вы не можете установить dplyr, do.call(rbind, selection) также работает (но немного медленнее, и это более уродливый код.)

Другие вопросы по тегам