r - 创建新列,设置值等于 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
解决方案
这里有几个选择。
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
推荐阅读
- angular - 基于条件的具有相同 url 的多个路由
- java - 尝试访问静态子文件夹时,Spring Boot 自定义 404 页面失败
- ios - 将 base64 字符串解码为 UIImage 时出错
- metabase - 使用锁定参数嵌入 Metabase 仪表板时出错
- java - 如何在不出现 StackOverflowException 的情况下序列化大型 HashMap
- java - 停止 java web 应用程序返回错误 403: Forbidden
- mysql - 隔离级别 Read_Committed 不起作用
- javascript - 在嵌套的二维对象数组中查找一个值并删除该值
- c - Strtok 返回错误数据
- unix - 如何以编程方式查找当前登录的用户 ID?