如何将R语言数据框中的name列拆分为scale、item、time三列?
拆分name列为scale、item、time变量的实现方法
我们已得到经pivot_longer转换后的长格式tibble,其中name列的格式为xyz数字_t数字或ab数字_t数字,需要将其拆分为三个变量:
- scale:提取前缀(如
xyz、ab) - item:提取前缀后的数字(如
1、2) - time:提取
_t后的数字(如1、2、3)
以下是几种基于tidyverse的实现方法:
方法1:使用separate_wider_regex(tidyr 1.3.0+推荐)
通过正则表达式直接定义各变量的匹配规则,逻辑清晰:
library(tidyverse) # 假设长表对象为long_df long_df %>% separate_wider_regex( name, patterns = list( scale = "(xyz|ab)", item = "(\\d)", "_t", # 跳过固定分隔符部分 time = "(\\d)" ) )
方法2:使用extract函数
利用正则捕获组一次性提取三个变量,还可自动转换数据类型:
long_df %>% extract( name, into = c("scale", "item", "time"), regex = "(xyz|ab)(\\d)_t(\\d)", convert = TRUE # 将item和time转为整数类型 )
方法3:分步拆分(无需复杂正则)
先按_t拆分出time,再拆分前缀与item:
long_df %>% # 第一步拆分出scale_item和time separate(name, into = c("scale_item", "time"), sep = "_t", convert = TRUE) %>% # 第二步在xyz/ab后拆分出scale和item separate(scale_item, into = c("scale", "item"), sep = "(?<=xyz|ab)", convert = TRUE)
内容的提问来源于stack exchange,提问作者D. Studer
相关产品推荐
相关产品推荐

