我有這一系列的嵌套陳述句
data$Country == 1,"Brazil",
ifelse(data$Country == 2, "Canada",ifelse(
data$Country == 3, "China",ifelse(
data$Country == 4, "Ecuador",ifelse(
data$Country == 5, "France",ifelse(
data$Country == 6, "Germany",ifelse(
data$Country == 7, "India",ifelse(
data$Country == 8, "Italy",ifelse(
data$Country == 9, "Mexico",ifelse(
data$Country == 10, "Nigeria",ifelse(
data$Country == 11, "Poland",ifelse(
data$Country == 12, "Russia",ifelse(
data$Country == 13, "South Africa",
ifelse(
data$Country == 14, "South Korea",ifelse(
data$Country == 15, "Singapore",
ifelse(
data$Country == 16, "Spain",
ifelse(
data$Country == 17, "Sweden",ifelse(
data$Country == 18, "United Kingdom",ifelse(
data$Country == 19, "United States","l"
))))))))))))))))))))
我一直在尋找將任何編碼變數轉換為相應國家/地區名稱的最快方法。您認為有沒有辦法應對這種操作?
非常感謝
uj5u.com熱心網友回復:
有2個選項:
1:case_when來自dplyr
library(dplyr)
data.frame(info = letters[1:5],
country_id = 1:5) %>%
mutate(country_name = case_when(country_id == 1 ~ "Brazil",
country_id == 2 ~ "Canada",
country_id == 3 ~ "China",
country_id == 4 ~ "Ecuador",
country_id == 5 ~ "France",
TRUE ~ "Unknown"))
info country_id country_name
1 a 1 Brazil
2 b 2 Canada
3 c 3 China
4 d 4 Ecuador
5 e 5 France
2:合并或加入國家/地區表中的資訊:
# country table
countries <- data.frame(country_id = 1:5,
country_name = c("Brazil", "Canada", "China", "Ecuador", "France"))
data.frame(info = letters[1:5],
country_id = 1:5) %>%
left_join(countries, by = "country_id")
info country_id country_name
1 a 1 Brazil
2 b 2 Canada
3 c 3 China
4 d 4 Ecuador
5 e 5 France
我的偏好是 2,更少的編碼和更少的錯誤機會。您可以將國家表保存在您的資料庫或某個檔案中,并在無需更改代碼的情況下進行維護。
uj5u.com熱心網友回復:
我不確定所需的用途。但也許您可以嘗試使用命名向量。這不是最優雅的解決方案,盡管它解決了 ifelse 混亂;)
4個國家的例子。中國 = "4"
countrys <- c("Brazil", "Canada",
"China",
"Ecuador")
names(countrys) <- c(2:5)
# Test data.frame
data <- data.frame(country = 4)
# Now we can get the country directly from the data$country:
# Careful! 4 is not '4'
unname(countrys[as.character(data$country)])
uj5u.com熱心網友回復:
這是一個非常好的switch陳述句案例,在我看來,它比dplyr::case_when或一系列更易讀的代碼ifelse,并且很容易擴展,例如,如果有進一步的標準,如地區、城市等。
get_country <- Vectorize(function(x){
switch(as.character(x),
"1" = "Brazil", "2" = "Canada", "3" = "China", "4" = "Ecuador",
"5" = "France", "6" = "Germany", "7" = "India", "8" = "Italy",
"9" = "Mexico", "10" = "Nigeria", "11" = "Poland", "12" = "Russia",
"13" = "South Africa", "14" = "South Korea", "15" = "Singapore",
"16" = "Spain", "17" = "Sweden", "18" = "United Kingdom", "19" = "United States",
NA)
})
data.frame(info = letters[1:5],
country_id = 1:5) %>%
mutate(country = get_country(country_id))
info country_id country
1 a 1 Brazil
2 b 2 Canada
3 c 3 China
4 d 4 Ecuador
5 e 5 France
但是像這樣的長陳述句需要大量的作業才能輸入。或者,一種更動態的方法是,我們可以switch使用接受輸入向量的建構式來創建陳述句。這里我使用包中找到的ISO3166資料集maps來創建 269 個國家/地區的運算式。
constructor <- function(ids, names){
purrr::imap_chr(as.character(ids), ~paste(paste0("\"", .x ,"\""),
paste0("\"", names[.y], "\""),
sep = "=")) %>%
paste0(collapse = ", ") %>%
paste0("Vectorize(function(x) switch(as.character(x), ", ., ", NA))", collapse = "") %>%
str2expression()
}
get_country <- eval(constructor(1:149, trimws(rworldmap::countryExData$Country)))
set.seed(1)
data.frame(info = sample(letters, size = 5, replace = T),
country_id = sample.int(149, 5, replace = T)) %>%
mutate(country = get_country(country_id))
info country_id country
1 y 122 Sierra Leone
2 h 39 Algeria
3 l 42 Eritrea
4 y 134 Trinidad & Tobago
5 w 24 Chile
為了展示力量 - 讓我們用 2 行代碼為大約 20 000 個城市創建一個控制流
CITIES <- maps::world.cities %>% filter(pop > 10000) %>% arrange(desc(pop))
get_city <- eval(constructor(1:nrow(CITIES), trimws(CITIES$name)))
data.frame(city_id = sample.int(23255, size = 100, replace = T),
country_id = sample.int(269, 100, replace = T)) %>%
mutate(country = get_country(country_id),
city = get_city(city_id))
這種方法的一個好處是您可以通過確保優化建構式的輸入向量來輕松優化控制流,即最先出現的情況,并可能生成支持嵌套方法的函式,例如get_continent(get_country(get_city)))。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362773.html
上一篇:如果單元格值的最后2位大于和小于
