首页 > 解决方案 > 排列后如何正确切片?(右)

问题描述

我无法根据指定的代码进行切片。请参阅下面的可重现示例:

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 中获取的),但结果是一样的。我该怎么走?

标签: rdplyr

解决方案


slice_heador根据给定slice_tail返回头行和尾行n。如果是两端都取,我们可以用slice带索引的( 1:2-head,(n()-1):n()fortail

library(dplyr)
UN11 %>% 
    dplyr::arrange(Residuals) %>%
    dplyr::slice(c(1:2, (n()-1):n()))

或使用row_numberwithhead/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))

推荐阅读