使用tidyr拆分艺人活跃期列,提取首末职业生涯时间问题
艺人活跃期列拆分:提取首次活跃年份与末次活跃状态
问题分析
你需要拆分period_active列,提取每个艺人的首次活跃年份和末次活跃状态,但之前的尝试存在两个核心问题:
- 使用
tidyr::separate时未将结果赋值给数据框,仅在控制台输出,未保存修改; - 直接用
strsplit赋值会得到列表型列,无法得到预期的字符型结果。
解决方案
结合dplyr和stringr处理多时间段的复杂情况,步骤如下:
1. 构造示例数据
先模拟你的数据结构方便演示:
df <- data.frame( artist = c("Artist A", "Artist B", "Artist C"), period_active = c("1990-present", "1995-1997, 2008, 2010-present", "2005-2012"), stringsAsFactors = FALSE )
2. 处理拆分逻辑
library(dplyr) library(stringr) # 处理并生成目标列 df_processed <- df %>% # 将多时间段按逗号(含后续空格)分割为列表 mutate(period_list = str_split(period_active, ",\\s*")) %>% # 提取首次活跃年份:取第一个时间段的开头数字 mutate(start_of_career = str_extract(map_chr(period_list, first), "^\\d+")) %>% # 提取末次活跃状态:取最后一个时间段的结束部分 mutate(end_of_career = map_chr(period_list, last) %>% str_replace("^\\d+-", "") %>% # 处理单个年份的情况(如2008) ifelse(str_detect(., "^\\d+$"), ., .)) %>% # 移除中间辅助列 select(-period_list)
3. 结果展示
运行后得到处理后的数据框:
print(df_processed) #> artist period_active start_of_career end_of_career #> 1 Artist A 1990-present 1990 present #> 2 Artist B 1995-1997, 2008, 2010-present 1995 present #> 3 Artist C 2005-2012 2005 2012
对之前错误的修正
- 若要使用
separate,需将结果赋值给新数据框或用%<>%修改原数据框(需加载magrittr):library(magrittr) df %<>% separate(col = period_active, into = c('start_of_career', 'end_of_career'), sep = '-') strsplit返回列表,需用map_chr等函数提取每个元素的字符值,避免生成列表型列。
内容的提问来源于stack exchange,提问作者LiLaLaune
相关产品推荐
相关产品推荐

