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

R语言优化音乐专辑年份区间分组与数据集列新增代码的技术问询

年份分组优化需求

我正在分析从音乐专辑排名网站爬取的数据,需要将专辑发行年份分组为指定区间(如1992年发行的专辑归为1991-2010区间)。当前数据集原本无Year_Range列,我已通过一段较长的循环代码实现年份分组并新增该列至数据集,现想知道是否存在仅需2-3个命令的更优实现方式:

原循环代码:

year_range1 = c()
year_range2 = c()
year_range3 = c()
year_range4 = c()

for (x in 1950:1970){
  year_range1 <- append(year_range1,x)
}

for (x in 1971:1990){
  year_range2 <- append(year_range2,x)
}

for (x in 1991:2010){
  year_range3 <- append(year_range3,x)
}

for (x in 2011:(format(Sys.Date(), "%Y"))){
  year_range4 <- append(year_range4,x)
}

range1=0
range2=0
range3=0
range4=0
range=c()

for (x in 1:length(year)) {
  if (!is.na(match(year[x],year_range1))) {
    range[x] <- "1950-1970"
  }else if (!is.na(match(year[x],year_range2))) {
    range[x] <- "1971-1990"
  }else if (!is.na(match(year[x],year_range3))) {
    range[x] <- "1991-2010"
  }else if (!is.na(match(year[x],year_range4))) {
    range[x] <- "2011-Present"
  }
} 

data_set <- data.frame("Sequence" = (1:80),
                       "Album" = album,
                       "Artist" = artist,
                       "Score" = score,
                       "Raters" = rating,
                       "Number of reviewers" = review,
                       "Year_Released" = year,
                       "Year_Range" = range,
                       "Genre" = genre)
更优实现方案

方案一:使用Base R的cut()函数

cut()是专门用于连续数值分组的函数,一行核心代码就能完成年份区间映射,无需循环构建区间列表:

# 获取当前年份并定义分组规则
current_year <- as.integer(format(Sys.Date(), "%Y"))
breaks <- c(1949, 1970, 1990, 2010, current_year)
labels <- c("1950-1970", "1971-1990", "1991-2010", "2011-Present")

# 直接生成Year_Range列并添加到数据集
data_set$Year_Range <- cut(data_set$Year_Released, breaks = breaks, labels = labels, include.lowest = TRUE)
  • breaks设置分组边界,1949用于确保1950被包含进第一个区间;include.lowest = TRUE保证最小值被正确匹配。

方案二:使用tidyverse的case_when()函数

若习惯用tidyverse语法,dplyr::case_when()可直观通过逻辑判断完成分组,两步即可实现:

library(dplyr)

current_year <- as.integer(format(Sys.Date(), "%Y"))

# 新增Year_Range列
data_set <- data_set %>%
  mutate(Year_Range = case_when(
    Year_Released >= 1950 & Year_Released <= 1970 ~ "1950-1970",
    Year_Released >= 1971 & Year_Released <= 1990 ~ "1971-1990",
    Year_Released >= 1991 & Year_Released <= 2010 ~ "1991-2010",
    Year_Released >= 2011 & Year_Released <= current_year ~ "2011-Present",
    TRUE ~ NA_character_ # 处理不符合区间的异常年份
  ))
  • 代码可读性强,TRUE ~ NA_character_可避免无匹配年份导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:40:36