Как правильно нарезать после того, как разложить? (R)

#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. Хорошо, это работает! Я думаю, вы были правы! Спасибо!