You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 22:45:44