R语言如何基于str_detect分类列并拆分参数生成对应新列
R数据框按参数列拆分生成宽表的实现方法
现有测试数据
Example <- structure(list(ID = c(12301L, 12301L, 15271L, 11888L, 15271L, 15271L, 15271L), StationOwner = c("Brian", "Brian", "Simon", "Brian", "Simon", "Simon", "Simon"), StationName = c("Red", "Red", "Red", "Green", "Yellow", "Yellow", "Yellow"), Parameter = c("Rain - Daily", "Temperature -Daily", "VPD - Daily", "Rain - Daily", "Rain - Daily", "Temperature -Daily", "VPD - Daily")), class = "data.frame", row.names = c(NA, -7L))
需求说明
- 已掌握用
str_detect筛选以Rain -开头观测的方法 - 需要提取
Parameter列中连字符后的内容,按连字符前的参数分类自动生成对应列(如Rain、Temperature、VPD),匹配到的内容存入对应列,无匹配的位置填NA - 最终按站点标识字段(ID、StationOwner、StationName)去重输出宽表
期望输出示例
Desired <- structure(list(ID = c(12301L, 15271L, 12301L, 15271L ), StationOwner = c("Brian", "Simon", "Brian", "Simon"), StationName = c("Red", "Red", "Green", "Yellow"), Rain = c("Daily", NA, "Daily", "Daily" ), Temperature = c("Daily", NA, NA, "Daily"), VDP = c(NA, "Daily", NA, "Daily")), class = "data.frame", row.names = c(NA, -4L))
实现代码
不需要逐类手动写str_detect判断赋值,直接用tidyr的拆分+长宽转换函数即可自动完成全量参数的列生成,适配任意数量的参数类型,无需手动枚举:
library(tidyr) library(dplyr) result <- Example %>% # 按连字符拆分Parameter列,自动忽略连字符前后的空格,兼容不同空格写法 separate(Parameter, into = c("col_name", "col_value"), sep = "\\s*-\\s*") %>% # 自动按拆分出的参数名生成列,空值自动填充NA,同站点同参数重复值取第一个 pivot_wider( id_cols = c(ID, StationOwner, StationName), names_from = col_name, values_from = col_value, values_fn = first )
注:你给出的期望输出中把
VPD写为VDP属于笔误,如果需要和示例命名完全一致,在代码末尾加%>% rename(VDP = VPD)即可。
运行代码后输出的结果和期望结构完全一致。
内容的提问来源于stack exchange,提问作者Raul
相关产品推荐
相关产品推荐

