Как извлечь определенные интервалы из набора данных? - PullRequest
0 голосов
/ 12 декабря 2018

У меня большой набор данных (более 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 Ответ

0 голосов
/ 12 декабря 2018

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

splitted <- split(dataset, dataset$Trials)

Затем для каждого из этих элементов мы выбираем все непроверяемые элементы, которые удовлетворяют 2 условиям:>= самый маленький чек и <= самый большой чек.И нам нужно сделать это для каждого из sub-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 -пакета

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

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

...