首页 > 解决方案 > 创建新列,设置值等于 R 中单独列表中的静态值

问题描述

我的数据如下所示:

id    country   name    
1     BE        John
2     NL        Nancy
3     UK        Drew
4     UK        Ted

我想添加一个名为 population 的新列,它对于每一行将其值设置为等于静态分配的值。所以我正在考虑使用这样的静态列表:

pop <- list(BE = 1500000, NL = 25000000, UK = 80000000)

我有很多国家,并且宁愿在没有一堆条件语句的情况下这样做。基本上我想从国家列中获取密钥,在弹出列表中查找值并将该值放入新的人口列中。

输出应如下所示:

id    country   name    population
1     BE        John    15000000
2     NL        Nancy   25000000
3     UK        Drew    80000000
4     UK        Ted     80000000

标签: r

解决方案


这里有几个选择。

  • dplyr::case_when如果您的国家/地区数量较少(例如在您的示例中),这很有用。它是多个if else语句的向量化包装器。

  • dplyr::*_join如果您有另一个将 ID 与值相关联的表/数据框(例如国家/地区人口),则函数族是此类问题的标准方法。在这种情况下,dplyr::left_join解决它。(也许你对 SQL 不熟悉?)

library(dplyr)

df <- tibble(country = c("BE", "NL", "UK", "UK"),
             name = c("John", "Nancy", "Drew", "Ted"))

# Using `dplyr::case_when`
df %>%
  mutate(population = case_when(country == "BE" ~ 1500000L,
                                country == "NL" ~ 25000000L,
                                country == "UK" ~ 80000000L,
                                TRUE ~ NA_integer_))

# Using `dplyr::left_join` with a relational country-population dataframe
country_population <- tibble(country = c("BE", "NL", "UK"),
                             population = c(1500000L, 25000000L, 80000000L))

left_join(df, country_population, by = "country")


# A tibble: 4 x 3
  country name  population
  <chr>   <chr>      <int>
1 BE      John     1500000
2 NL      Nancy   25000000
3 UK      Drew    80000000
4 UK      Ted     80000000


推荐阅读