Извлечь одну строку с уникальной переменной id в R

#r #dataframe #dplyr #tidyverse

#r #фрейм данных #dplyr #tidyverse

Вопрос:

Мне было интересно, есть ли способ подмножества одной из каждой строки с уникальным значением sch.id в моем data ниже (например, первая строка каждой sch.id )?

Поскольку существует 160 уникальных данных sch.id , я ожидаю, что в конечном результате будет 160 строк.

 library(tidyverse)

hsb <- read.csv('https://raw.githubusercontent.com/rnorouzian/e/master/hsb.csv')

data <- hsb %>% group_by(sch.id) %>% mutate(math_ave = mean(math))

  

Комментарии:

1. Вам нужно summarise вместо mutate

Ответ №1:

Если нам нужны все переменные, можно использовать distinct после mutate , чтобы сохранить первую строку для каждой ‘sch.id ‘

 library(dplyr)
hsb %>% 
  group_by(sch.id) %>% 
  mutate(math_ave = mean(math)) %>%
  ungroup %>% 
  distinct(sch.id, .keep_all = TRUE)
# A tibble: 160 x 9
#   sch.id  math  size sector meanses minority female    ses math_ave
#    <dbl> <dbl> <dbl>  <dbl>   <dbl>    <dbl>  <dbl>  <dbl>    <dbl>
# 1   1224  5.88   842      0  -0.428        0      1 -1.53      9.72
# 2   1288  7.86  1855      0   0.128        0      1 -0.788    13.5 
# 3   1296 12.7   1719      0  -0.42         1      1 -0.148     7.64
# 4   1308 13.2    716      1   0.534        0      0  0.422    16.3 
# 5   1317 12.9    455      1   0.351        0      1  0.882    13.2 
# 6   1358 -1.35  1430      0  -0.014        1      0  0.032    11.2 
# 7   1374 16.7   2400      0  -0.007        0      0  0.322     9.73
# 8   1433 12.9    899      1   0.718        0      0  0.812    19.7 
# 9   1436 24.1    185      1   0.569        0      0  0.222    18.1 
#10   1461 13.0   1672      0   0.683        0      1  0.042    16.8 
# … with 150 more rows
  

Или другой вариант без ungroup редактирования — это slice первая строка

 hsb %>% 
    group_by(sch.id) %>% 
    mutate(math_ave = mean(math)) %>%
    slice(1)
  

Или с помощью base R с ave и duplicated

 transform(hsb, math_ave = ave(math, sch.id))[!duplicated(hsb$sch.id),]
  

Комментарии:

1. @rnorouzian 160 rows would meant that all other columns we are dropping some rorws i.e. distinct` получит первую строку для каждого ‘sch.id ‘ после выполнения mutate

2. @rnorouzian это не обязательно, но на случай, если вы захотите удалить этот атрибут

Ответ №2:

data.table подход может быть :

 library(data.table)
setDT(data)[, .SD[1], sch.id]

#     sch.id   math size sector meanses minority female    ses  math_ave
#  1:   1224  5.876  842      0  -0.428        0      1 -1.528  9.715447
#  2:   1288  7.857 1855      0   0.128        0      1 -0.788 13.510800
#  3:   1296 12.668 1719      0  -0.420        1      1 -0.148  7.635958
#  4:   1308 13.233  716      1   0.534        0      0  0.422 16.255500
#  5:   1317 12.862  455      1   0.351        0      1  0.882 13.177687
# ---                                                                   
#156:   9359 19.797 1184      1   0.360        0      0  0.612 15.270623
#157:   9397  5.873 1314      0   0.140        0      0  0.502 10.355468
#158:   9508 13.932 1119      1  -0.132        0      0  0.242 13.574657
#159:   9550  1.766 1532      0   0.059        1      0 -0.228 11.089138
#160:   9586 14.076  262      1   0.627        0      1  0.852 14.863695