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值。
错误分析
- 第一种尝试的
case_when逻辑错误:- 变量名大小写不匹配:数据列是
Name,代码里误用了小写name - 判断逻辑错误:
"ox" %in% name是检查字符串是否在向量中,而非单个单元格是否包含该字符串,应该使用字符串检测函数。
- 变量名大小写不匹配:数据列是
- 第二种尝试的
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
相关产品推荐
相关产品推荐

