#r #dplyr #filtering
Вопрос:
У меня есть следующий набор данных:
Прибыль | MRO 15×5 | D30 |
---|---|---|
$150.00 | -9.189 | -0.24 |
$12.50 | -6.076 | -0.248 |
-$125.00 | -7.699 | -0.282 |
-$162.50 | -8.008 | -0.281 |
-$175.00 | -0.183 | -0.056 |
-$175.00 | -0.235 | -0.061 |
$275.00 | 0.141 | -0.027 |
-$175.00 | -4.062 | -0.103 |
-$162.50 | -5.654 | -0.258 |
-$162.50 | -1.578 | -0.051 |
-$175.00 | -3.336 | -0.205 |
-$162.50 | -1.523 | -0.022 |
$412.50 | -1.524 | -0.194 |
$337.50 | -1.049 | -0.055 |
$100.00 | -1.043 | -0.059 |
Я хочу сначала расположить столбец D30 в порядке возрастания, а затем посмотреть столбец Прибыли. Если значения верхней n строки и нижней n строки (диапазон ячеек) в столбце Прибыль меньше -50, удалите всю строку в наборе данных.
Результат был бы таким:
Прибыль | MRO 15×5 | D30 |
---|---|---|
$275.00 | 0.141 | -0.027 |
-$162.50 | -1.578 | -0.051 |
$337.50 | -1.049 | -0.055 |
-$175.00 | -0.183 | -0.056 |
$100.00 | -1.043 | -0.059 |
-$175.00 | -0.235 | -0.061 |
-$175.00 | -4.062 | -0.103 |
$412.50 | -1.524 | -0.194 |
-$175.00 | -3.336 | -0.205 |
$150.00 | -9.189 | -0.24 |
$12.50 | -6.076 | -0.248 |
Этот вывод является результатом удаления верхней 1-й строки и нижних 3 строк из всего набора данных, поскольку эти строки (диапазон значений) имели значения прибыли менее -50.
Может ли кто-нибудь, пожалуйста, помочь мне сделать это в программе R с помощью dplyr или с помощью некоторых других пакетов фильтрации?
Я был бы благодарен за вашу добрую поддержку.
С уважением, Фархан
Комментарии:
1. Чтобы уточнить, под «возрастанием» вы подразумеваете «становление более негативным»? И вы хотите удалить все смежные первую и последнюю строки с прибылью
2. Дорогой Джон, спасибо за ваш быстрый ответ. Да, это может привести к увеличению отрицательных значений в столбце Прибыль. А затем сверху и снизу все отрицательные смежные значения в прибыли, которые меньше -50, должны быть удалены, и это удаление должно касаться целых строк. Если первое значение сверху или снизу положительное, то диапазон ячеек сверху или снизу, сумма которых меньше -50, следует удалить все подмножество.
3. «Если первое значение сверху или снизу положительное, то диапазон ячеек сверху или снизу, сумма которых меньше -50, следует удалить все подмножество». — поэтому, если верх и низ gt; -50, удалите все строки gt;
4. Если сверху и снизу оба gt;-50, то смотрите сумму в диапазоне как сверху, так и снизу, и если сумма из диапазона gt;
Ответ №1:
Воспользуйся cumany
. В сочетании с filter
этим он удаляет строки до тех пор , пока не будет выполнен критерий (здесь Profit lt;= -50
).
Первая команда-это способ разбора вашего Profit
столбца на числовой столбец.
library(dplyr) data %gt;% mutate(Profit = parse_number(str_replace(Profit,"^-\$(.*)$", "$-\1"))) %gt;% arrange(D30) %gt;% filter(cumany(Profit gt; -50)) %gt;% arrange(desc(D30)) %gt;% filter(cumany(Profit gt; -50)) Profit MRO_15x5 D30 1 275.0 0.141 -0.027 2 -162.5 -1.578 -0.051 3 337.5 -1.049 -0.055 4 -175.0 -0.183 -0.056 5 100.0 -1.043 -0.059 6 -175.0 -0.235 -0.061 7 -175.0 -4.062 -0.103 8 412.5 -1.524 -0.194 9 -175.0 -3.336 -0.205 10 150.0 -9.189 -0.240 11 12.5 -6.076 -0.248
Комментарии:
1. Огромное спасибо. Это сэкономит мне много времени на фильтрацию данных. Высоко ценю этот ответ.
2. Да, результаты абсолютно соответствуют требованиям. Спасибо за вашу поддержку.
3. Готово :). Спасибо