如何基于指定扩展数据框在R语言中创建类Python格式的映射字典
在R中创建类似Python格式的映射字典
我有如下生成数据框的R代码:
data=data.frame(v1=c("traf","hayr", "poaz", "adfv", "srta")) dup=rep(2,nrow(data)) id=rep(1:nrow(data), dup) dupdf=data[id,] dupdf2=as.data.frame(dupdf) df=dupdf2 %>% mutate(col1 = if_else(row_number() %% 2 == 0, paste(dupdf, "_var"), dupdf)) %>%select(-dupdf)
运行后得到的df如下:
col1 1 traf 2 traf _var 3 hayr 4 hayr _var 5 poaz 6 poaz _var 7 adfv 8 adfv _var 9 srta 10 srta _var
我希望在R语言中创建一个类似Python格式的字典(键值对映射),Python示例如下:
{'traf':1, 'traf _var':1, 'hayr':2, 'hayr _var':2, 'poaz':3, 'poaz _var':3, 'adfv':4, 'adfv _var':4, 'srta':5, 'srta _var':5}
我知道用列表是实现需求的最佳方式,但不清楚具体操作步骤。我的真实数据包含130行(对应65个不同的唯一值),希望得到帮助。
解决方案
在R里,命名向量是最接近Python字典的结构,同样支持通过键快速查找对应值,下面提供两种高效的实现方法:
方法1:基于现有df生成映射
因为你的数据是每2行对应一个原始组,我们可以用整数除法生成对应的组编号,再转换成命名向量:
library(dplyr) # 生成映射命名向量 name_map <- df %>% mutate(group_id = (row_number() + 1) %/% 2) %>% # 每2行一组,生成1,1,2,2...的ID select(col1, group_id) %>% tibble::deframe() # 将两列转换为"键-值"形式的命名向量 # 查看结果 name_map
运行后会得到如下输出:
traf traf _var hayr hayr _var poaz poaz _var adfv adfv _var srta srta _var 1 1 2 2 3 3 4 4 5 5
如果需要转换成类似Python字典的列表格式查看,只需用as.list(name_map):
as.list(name_map)
输出示例:
$traf [1] 1 $`traf _var` [1] 1 $hayr [1] 2 $`hayr _var` [1] 2 # 其余键值对省略
方法2:从原始data直接构建映射
如果你还保留着原始的data数据框,直接从源数据构建会更高效,不需要依赖生成后的df:
# 生成所有需要的键(原始值 + 带_var的后缀值) keys <- c(data$v1, paste(data$v1, "_var")) # 生成对应的组ID(每个原始值的ID重复两次) values <- rep(1:nrow(data), each = 2) # 创建命名向量 name_map <- setNames(values, keys)
这个方法对于130行的数据集来说完全没有性能问题,运行速度更快。
内容的提问来源于stack exchange,提问作者Patrick Parts
相关产品推荐
相关产品推荐

