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

R语言:如何基于Name列含ox/cat创建并填充ox、cat新列?

数据重塑:基于Name列值拆分ox/cat列

问题场景

现有数据结构如下:

Name       value
df_ox_val    1  
df_cat_val   2   
df_cat_val   1  
df_ox_val    4  
df_ox_val    5  
...  

需要将数据重塑为:

ox      cat  
NA        1  
2       NA  
1       NA  
NA        4  
NA        5  
...   

要求:当Name列包含"ox"时,ox列填充对应value值;包含"cat"时,cat列填充对应value值。

错误分析

  1. 第一种尝试的case_when逻辑错误:
    • 变量名大小写不匹配:数据列是Name,代码里误用了小写name
    • 判断逻辑错误:"ox" %in% name是检查字符串是否在向量中,而非单个单元格是否包含该字符串,应该使用字符串检测函数。
  2. 第二种尝试的pivot_wider未做预处理:直接用原始Name列作为列名来源,会生成df_ox_val、df_cat_val等独立列,无法合并成ox/cat两类。

正确实现方法

方法一:使用mutate + 字符串检测

先加载dplyr和stringr包(或用基础R的grepl),通过字符串检测判断Name列内容,再用case_when赋值:

library(dplyr)
library(stringr)

df %>%
  mutate(
    ox = case_when(str_detect(Name, "ox") ~ value, TRUE ~ NA_real_),
    cat = case_when(str_detect(Name, "cat") ~ value, TRUE ~ NA_real_)
  ) %>%
  select(ox, cat) # 可选:只保留目标列

如果用基础R的grepl替代str_detect,代码如下:

df %>%
  mutate(
    ox = case_when(grepl("ox", Name) ~ value, TRUE ~ NA_real_),
    cat = case_when(grepl("cat", Name) ~ value, TRUE ~ NA_real_)
  ) %>%
  select(ox, cat)

方法二:预处理Name列后使用pivot_wider

先从Name列中提取出ox或cat标记,再用pivot_wider重塑:

library(dplyr)
library(tidyr)
library(stringr)

df %>%
  mutate(type = str_extract(Name, "ox|cat")) %>% # 提取ox或cat标记
  pivot_wider(
    values_from = value,
    names_from = type,
    values_fill = NA_real_ # 填充缺失值为NA
  ) %>%
  select(ox, cat) # 按需求调整列顺序

内容的提问来源于stack exchange,提问作者Vicki Ponce

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:03:11