为何ggplot2movies数据集经getDecade处理后多数电影被归类为1970s?
问题排查与解决方案
问题原因
getDecade函数中错误使用了标量逻辑运算符&&,而非R中用于向量化元素判断的&。&&仅会比较向量的第一个元素,返回单一布尔值,随后该值会被广播到整个输入向量的所有元素。这意味着函数实际上只根据数据集的第一个年份来判定所有行的年代类别——若第一个年份落在1970-1980区间,所有年份≥1900的电影都会被错误归类为1970s,仅年份<1900的电影会触发第一个条件被分到1890s。
修复方案
将函数中所有&&替换为向量化的&,修改后的函数如下:
getDecade <- function(year) { case_when( year < 1900 ~ "1890s", year >= 1900 & year < 1910 ~ "1900s", year >= 1910 & year < 1920 ~ "1910s", year >= 1920 & year < 1930 ~ "1920s", year >= 1930 & year < 1940 ~ "1930s", year >= 1940 & year < 1950 ~ "1940s", year >= 1950 & year < 1960 ~ "1950s", year >= 1960 & year < 1970 ~ "1960s", year >= 1970 & year < 1980 ~ "1970s", year >= 1980 & year < 1990 ~ "1980s", year >= 1990 & year < 2000 ~ "1990s", year >= 2000 & year < 2010 ~ "2000s", TRUE ~ "other" ) }
优化建议
可以简化逻辑,通过数学计算直接生成年代字符串,避免重复的区间判断,降低出错概率:
getDecade <- function(year) { case_when( year < 1900 ~ "1890s", year >= 2010 ~ "other", TRUE ~ paste0(floor(year / 10) * 10, "s") ) }
内容的提问来源于stack exchange,提问作者Imme
相关产品推荐
相关产品推荐

