Как получить верхние значения на основе last_col(), а затем упорядочить в R?

#r #tidyverse

#r #tidyverse

Вопрос:

Я пытаюсь получить top 20 страны, в которых зарегистрировано наибольшее количество случаев latest date covid . Данные находятся внутри wide format и latest date являются last column .

 install.packages("covid19.analytics")

library(tidyverse)
library(covid19.analytics)

df <- covid19.data("ts-confirmed")
head(df)

############ output ############

Province.State Country.Region Lat Long 2020-01-22 2020-01-23
<chr> <chr> <dbl> <dbl> <int> <int>

Argentina   -38.41610   -63.61670   0   0   
Bangladesh  23.68500    90.35630    0   0   
Brazil  -14.23500   -51.92530   0   0   
Chile   -35.67510   -71.54300   0   0   
Colombia    4.57090 -74.29730   0   0   
France  46.22760    2.21370 0   0   
Germany 51.16569    10.45153    0   0   
India   20.59368    78.96288    0   0   
  

Я беру top 20 из фрейма данных, применяя его к last_col() последней дате, как показано в коде ниже, и это работает хорошо.

Проблема: но когда я передаю это, чтобы упорядочить порядок desc, это выдает ошибку.

arrange() часть приведенного ниже кода не работает, и я не уверен, почему она выдает мне ошибку, поскольку я предоставляю . ей фрейм данных и упорядочиваю на основе last_col() .

   top_n(df, n =20, wt = df %>% select(last_col())) %>%
    arrange(., . %>% select(last_col())) 
  

(в коде не использовался desc , поскольку он все равно выдавал ошибку, но будет использоваться, как только он заработает).

Странно, что top_n по умолчанию он не сортирует сам по себе, потому что top n означает сверху, поэтому в идеале он должен иметь сортировку по убыванию самостоятельно.

Ответ №1:

С arrange помощью, мы можем использовать across вместо подмножества с, select поскольку arrange ищет либо имя столбца без кавычек, либо полные значения столбца

 library(dplyr)
library(covid19.analytics)
top_n(df, n =20, wt = df %>%
           select(last_col())) %>%
    arrange(across(last_col()))
  

Это также можно записать как

 top_n(df, n = 20, wt = !! rlang::sym(names(df)[ncol(df)])) %>% 
        arrange(across(last_col()))
  

ПРИМЕЧАНИЕ: если мы не хотим повторять ‘df’, мы могли бы использовать . , но . в основном используется, когда у нас есть chain ( %>% ) для указания данных из lhs of %>% . Другой вариант cur_data

 top_n(df, n =20, wt = cur_data() %>% 
          select(last_col())) %>%
 nrow
#[1] 20
  

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

1. Спасибо @akrun за то, что показал оба решения, и это сработало. Я думаю, что буду придерживаться across, поскольку rlang меня это сильно смущает. Это не позволяет мне принять ответ до определенного срока, будет сделано, как только это позволит мне сделать. Еще раз спасибо!!

2. @ViSa На основе моей версии dplyr возвращает 20 строк top_n(df, n =20, wt = df %>% select(last_col())) %>% nrow# [1] 20

3. @ViSa разница в том, что вы используете n . вместо df . . используется, когда у вас есть цепочка с %>%

4. да, это работало. Это была моя ошибка. Я попытался заменить df на . и получил больше строк для top_n(df, n =20, wt = . %>% select(last_col())) . Ваше решение сработало!!

5. хорошо, я не знал об cur_data этом, обязательно попробую и это. Спасибо, что помогли мне 🙂