Как извлечь определенные интервалы из набора данных?
У меня есть большой набор данных (более 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)
также работает (но немного медленнее, и это более уродливый код.)