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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:45:32