#r #dplyr
#r #dplyr
Вопрос:
Я не могу нарезать в соответствии с указанным кодом. Смотрите воспроизводимый пример ниже:
library(alr4)
library(tidyverse)
modelUN <- lm(fertility ~ ppgdp, data = UN11)
Я хочу обозначить два самых высоких и самых низких остатка.
library(broom)
UN11 <- UN11 %>% mutate(Residuals = augment(modelUN) %>% pull(.resid))
UN11 %>% arrange(Residuals) %>% slice_head(n = 2)
Это не дает мне наименьших остатков. Я попытался сохранить набор данных (думая, что он извлекается из исходного df), но результат тот же. Как мне следует действовать дальше?
Комментарии:
1. Отредактировано для ясности и корректности.
Ответ №1:
slice_head
Или slice_tail
возвращает начальную и конечную строки на основе n
заданного. Если нужно получить оба конца, мы можем использовать slice
с индексом ( 1:2
— head и (n()-1):n()
для хвоста
library(dplyr)
UN11 %>%
dplyr::arrange(Residuals) %>%
dplyr::slice(c(1:2, (n()-1):n()))
Или использовать row_number
с head/tail
UN11 %>%
dplyr::arrange(Residuals) %>%
dplyr::slice(c(head(row_number(), 2), tail(row_number(), 2)))
# region group fertility ppgdp lifeExpF pctUrban Residuals
#1 Europe other 1.134 4477.7 78.40 49 -1.900575
#2 Europe other 1.450 1625.8 73.48 48 -1.675868
#3 Africa africa 6.300 1237.8 50.04 36 3.161712
#4 Africa africa 6.925 357.7 55.77 17 3.758539
и используя head
UN11 %>%
arrange(Residuals) %>%
head(2)
# region group fertility ppgdp lifeExpF pctUrban Residuals
#1 Europe other 1.134 4477.7 78.40 49 -1.900575
#2 Europe other 1.450 1625.8 73.48 48 -1.675868
Или другой вариант — slice_min/slice_max
и связать их вместе с bind_rows
(но он менее эффективен и менее прямой, чем индексный вариант в slice
)
UN11 %>%
slice_min(Residuals, n = 2) %>%
bind_rows(UN11 %>%
slice_max(Residuals, n = 2))
Комментарии:
1. Это мило! Моя проблема в том, что срезы не дают мне первые две строки в соответствии с функцией упорядочивания.
2. @AmoghJoshi Вы хотите, чтобы он был сгруппирован по «регионам», «группам», ?
3. Если вы запустите этот код, остаточное значение, отфильтрованное по упорядочиванию для первых двух строк, будет равно -1.90. Однако код фрагмента выдает мне неправильные первое и последнее значения. Первые два значения, извлекаемые кодом: -0.79 и 0.48 (для последнего).
4. @AmoghJoshi Я получаю
-1.900575
и-1.675868
как первую и вторую строки изarrange
5. Хорошо, это работает! Я думаю, вы были правы! Спасибо!