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

筛选2010-2019年人口普查DataFrame并添加行号报错求助

问题与解决:筛选人口普查数据并添加行号ID

问题描述

需要从包含人口普查数据的大型DataFrame中,筛选出years列(字符类型)中2010-2019年的数据子集,并为其添加行号ID。使用以下代码时触发警告:

acs_2010 <- subset(temp, years == as.character(2010:2019)) %>% mutate(., uID = row_number())

警告信息:

Warning message: In years == as.character(2010:2019) : longer object length is not a multiple of shorter object length

可复现数据集:

dput(temp)
structure(list(years = c("2009", "2017", "2018", "2018", "2020", 
"2017", "2015", "2009", "2019", "2017", "2018", "2020", "2020", 
"2016", "2016", "2015", "2018", "2018", "2013", "2016", "2012", 
"2020", "2019", "2010", "2015"), GEOID = c("17031600700", "17113001301", 
"17111871305", "17177000100", "17097862700", "17031300500", "17031816900", 
"17031260400", "17031830600", "17031250800", "17031834700", "17031830300", 
"17031811500", "17031823302", "17043845602", "17091010900", "17097860103", 
"17163500500", "17031611500", "17031841100", "17097861901", "17031814900", 
"17031810501", "17031804603", "17141961600"), TRACT = c("Census Tract 6007", 
"Census Tract 13.01", "Census Tract 8713.05", "Census Tract 1", 
"Census Tract 8627", "Census Tract 3005", "Census Tract 8169", 
"Census Tract 2604", "Census Tract 8306", "Census Tract 2508", 
"Census Tract 8347", "Census Tract 8303", "Census Tract 8115", 
"Census Tract 8233.02", "Census Tract 8456.02", "Census Tract 109", 
"Census Tract 8601.03", "Census Tract 5005", "Census Tract 6115", 
"Census Tract 8411", "Census Tract 8619.01", "Census Tract 8149", 
"Census Tract 8105.01", "Census Tract 8046.03", "Census Tract 9616"), 
COUNTY = c("Cook County", "McLean County", "McHenry County", 
"Stephenson County", "Lake County", "Cook County", "Cook County", 
"Cook County", "Cook County", "Cook County", "Cook County", "Cook County", 
"Cook County", "Cook County", "DuPage County", "Kankakee County", 
"Lake County", "St. Clair County", "Cook County", "Cook County", 
"Lake County", "Cook County", "Cook County", "Cook County", "Ogle County"), 
STATE = c("Illinois", "Illinois", "Illinois", "Illinois", 
"Illinois", "Illinois", "Illinois", "Illinois", "Illinois", "Illinois", 
"Illinois", "Illinois", "Illinois", "Illinois", "Illinois", "Illinois", 
"Illinois", "Illinois", "Illinois", "Illinois", "Illinois", "Illinois", 
"Illinois", "Illinois", "Illinois"), persons = c(2328, 1782, 
6309, 4354, 3524, 2781, 5479, 1231, 4733, 2415, 1426, 4536, 6387, 
6679, 4905, 4547, 3386, 2747, 2932, 7308, 4351, 6553, 5268, 5146, 
3411), hus = c(1133, 867, 2181, 2048, 1254, 1051, 1870, 575, 
2258, 883, 1032, 2394, 2068, 2500, 2095, 1978, 1402, 1209, 1119, 
2891, 1314, 2787, 2050, 2698, 1474), husocc = c(832, 785, 2098, 
1686, 1111, 853, 1636, 454, 1974, 782, 541, 2137, 1933, 2412, 
2039, 1655, 1325, 893, 831, 2674, 1289, 2487, 1945, 2468, 1325), 
husvac = c(301, 82, 83, 362, 143, 198, 234, 121, 284, 101, 
491, 257, 135, 88, 56, 323, 77, 316, 288, 217, 25, 300, 105, 
230, 149), husocc_own = c(417, 476, 1854, 1447, 530, 271, 1297, 
181, 480, 443, 45, 888, 1646, 1038, 1225, 1295, 1111, 309, 348, 
1134, 1151, 787, 1652, 898, 738)), row.names = c(NA, -25L), class = c("tbl_df", 
"tbl", "data.frame"))

警告原因

原代码中用==与向量as.character(2010:2019)比较时,R会执行循环补齐:将短向量重复至与长向量长度一致后逐元素比较。但years列有25行,2010:2019仅10个元素,25不是10的倍数,因此触发警告,且筛选逻辑错误——无法正确匹配所有2010-2019年的行。

解决方案

判断元素是否属于某个集合时,应使用%in%而非==。推荐采用tidyverse风格的代码,逻辑更清晰统一:

方法1:tidyverse风格(推荐)

library(dplyr)

acs_2010 <- temp %>%
  filter(years %in% as.character(2010:2019)) %>%
  mutate(uID = row_number())

方法2:保留subset()的写法

acs_2010 <- subset(temp, years %in% as.character(2010:2019)) %>%
  mutate(uID = row_number())

验证结果

运行上述代码后,将得到19行有效数据(排除了2009、2020年的6行),且uID列从1到19依次编号,无警告信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:05:26