如何使用separate()或cSplit()按|和:拆分单列键值对数据生成规范数据框
解决方案:拆分键值对为多列
这里用tidyverse的tidyr和dplyr包就能完美解决你的问题,全程不需要提前指定最终列数,自动识别所有出现过的键作为列名。
完整可运行代码
library(tidyr) library(dplyr) # 你的原始数据 data = structure(list(characteristicsAdditional = c("Tipo de inmueble:Piso|Estado:Bien|Antigüedad:30 a 50 años|Parking:Privado|Ascensor:Sí|Consumo energía:|Emisiones:", "Tipo de inmueble:Piso|Orientación:Sureste|Estado:Muy bien|Antigüedad:30 a 50 años|Consumo energía:|Emisiones:", "Tipo de inmueble:Apartamento|Orientación:Este|Estado:Bien|Antigüedad:30 a 50 años|Parking:Comunitario|Ascensor:Sí|Amueblado:Sí|Consumo energía:|Emisiones:", "Tipo de inmueble:Casa o chalet|Orientación:Sur|Agua caliente:Gas Natural|Calefacción:Propano|Estado:Casi nuevo|Amueblado:Sí|Consumo energía:|Emisiones:", "Tipo de inmueble:Casa o chalet|Parking:Privado|Amueblado:Sí|Consumo energía:|Emisiones:", "Tipo de inmueble:Casa adosada|Estado:Casi nuevo|Antigüedad:10 a 20 años|Parking:Privado|Consumo energía:|Emisiones:" )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" )) # 核心处理流程 result <- data %>% # 1. 把|分隔的每个键值对拆成独立行 separate_rows(characteristicsAdditional, sep = "\\|") %>% # 2. 按:拆分键和值,空值补在右侧 separate(characteristicsAdditional, into = c("key", "value"), sep = ":", fill = "right") %>% # 3. 把空字符串转为NA(对应那些没有值的键,比如Consumo energía:) mutate(value = na_if(value, "")) %>% # 4. 转成宽格式,自动生成所有键对应的列 pivot_wider(names_from = key, values_from = value) print(result)
步骤详解
separate_rows():把每一行的长字符串按|拆成多行,这样每个键值对单独占一行,避免了直接拆分列时的冗余问题。注意这里sep要用\\|,因为|是正则表达式的特殊字符,必须转义。separate():将每个键值对按:拆分为key(属性名)和value(属性值)两列,fill = "right"保证当键后面没有值时(比如Consumo energía:),value列会得到空字符串而不是抛出错误。na_if():把空字符串的value转为NA,和你预期输出里的缺失值格式保持一致。pivot_wider():把长格式数据重塑为宽格式,自动将所有出现过的key作为新列名,对应行的value填充单元格,缺失的属性自动补NA。
输出效果
运行后得到的结果完全符合你的预期,所有属性都成为独立列,每条原始记录对应一行,缺失的属性值显示为NA。
内容的提问来源于stack exchange,提问作者user113156
相关产品推荐
相关产品推荐

