#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
этом, обязательно попробую и это. Спасибо, что помогли мне 🙂