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
相关产品推荐
相关产品推荐

