Отображение ключ-значение в R - PullRequest
1 голос
/ 11 апреля 2020

Я бы хотел классифицировать города в city_1, city_2 и т. Д. c в моем наборе данных ... но с использованием сопоставления значений ключей. Например, я хотел бы получить "city_1", указав 4059 в качестве значения и т. Д.

У вас есть предложения, как мне решить эту проблему? Спасибо!

Это список:

zip_codes <- list("city_1" =c(4000, 4001, 4005, 4009, 4010, 4018, 4019, 4020, 4030, 4031, 4051, 4052, 4053, 4054, 4055, 4056, 4057, 4058, 4059))
|__A____|___B___|
|__4000_|_city_1|
|__4009_|_city_1|
|__4059_|_city_1|
|__4059_|_city_1|
|__4565_|_city_2|

Так, например, у меня есть набор данных, в котором почтовые индексы, такие как приведенные выше, появляются в столбцах, и я хотел бы указать, к какому месту относится каждый из этих zip_code. Я хочу сделать столбец "B" из списка почтовых индексов. Я думал о сопоставлении значений ключей, но, возможно, в R это не лучший способ .... У вас есть лучшие идеи?

Ответы [ 3 ]

1 голос
/ 11 апреля 2020

Мы можем создать пару данных ключ-значение из списка, используя stack.

ref_df <- stack(zip_codes)

и тогда легко извлечь название любого города, используя почтовый индекс.

as.character(ref_df$ind[ref_df$values == 4059])
#[1] "city_1"
1 голос
/ 11 апреля 2020

Если вам действительно нужны пары ключ-значение, то вы можете сделать это с именованным вектором. Например,

df <- data.frame(A = c(4000, 4009, 4059, 4565), 
                 B = c("city_1", "city_1", "city_1", "city_2"),
                 stringsAsFactors = FALSE)

keyvalue <- df$B
names(keyvalue) <- df$A

# Look up 4059:

keyvalue[as.character(4059)]
#>     4059 
#> "city_1"

Обратите внимание, что в исходной таблице дважды содержится 4059 таблиц. Это решение предполагает, что это была опечатка: вы не должны иметь один и тот же код более одного раза. Я даже не уверен, что это будет означать с точки зрения вашей первоначальной проблемы.

1 голос
/ 11 апреля 2020

Мы можем использовать enframe из tidyverse

 library(tibble)
 library(dplyr)
 ref_df <- enframe(zip_codes) %>%
             unnest(c(value))

, а затем мы можем извлечь с

as.character(ref_df$name[ref_df$value == 4059])
...