无法向列表追加值:R语言列表操作问题求助
问题:将数据框列转换为包含重复值的列表
我尝试多种方法向列表suburb_shootings追加shooting_cases数据框第4列(BORO列,记录纽约枪击案发区)的值,但均未成功。已尝试的代码如下:
suburb_shootings <- list() add_shootings_to_suburb_list <- function(){ total_rows <- nrow(shooting_cases[4]) for(x in 1:total_rows){ suburb_shootings[[x]] <- shooting_cases[x,4] } } add_shootings_to_suburb_list()
另一种尝试:
add_shootings_to_suburb_list <- function(){ total_rows <- nrow(shooting_cases[4]) for(x in 1:total_rows){ suburb_shootings[[x]] <- append(suburb_shootings, shooting_cases[x,4]) } } add_shootings_to_suburb_list()
还有:
add_shootings_to_suburb_list <- function(){ suburb_shootings <- list() total_rows <- nrow(shooting_cases[4]) for(x in 1:total_rows){ suburb_shootings <- append(suburb_shootings, shooting_cases[x,4]) } } add_shootings_to_suburb_list()
需求是生成包含重复区名的列表(如Brooklyn可能多次出现),用于后续可视化。
附CSV数据片段(BORO为案发区字段):
INCIDENT_KEY,OCCUR_DATE,OCCUR_TIME,BORO,PRECINCT,JURISDICTION_CODE,LOCATION_DESC,STATISTICAL_MURDER_FLAG,PERP_AGE_GROUP,PERP_SEX,PERP_RACE,VIC_AGE_GROUP,VIC_SEX,VIC_RACE,X_COORD_CD,Y_COORD_CD,Latitude,Longitude,Lon_Lat 236168668,11/11/2021,15:04:00,BROOKLYN,79,0,,false,,,,18-24,M,BLACK,996313,187499,40.68131820000008,-73.95650899099996,POINT (-73.95650899099996 40.68131820000008) 231008085,07/16/2021,22:05:00,BROOKLYN,72,0,,false,45-64,M,ASIAN / PACIFIC ISLANDER,25-44,M,ASIAN / PACIFIC ISLANDER,981845,171118,40.63636384100005,-74.00866668999998,POINT (-74.00866668999998 40.63636384100005) 230717903,07/11/2021,01:09:00,BROOKLYN,79,0,,false,<18,M,BLACK,25-44,M,BLACK,996546,187436,40.68114495900005,-73.95566903799994,POINT (-73.95566903799994 40.68114495900005)
数据集共2万多行。
问题分析
- 第一个代码:函数内部修改全局变量
suburb_shootings时,未使用<<-赋值符,默认创建局部变量,外部列表不会被修改;另外nrow(shooting_cases[4])写法冗余,直接用nrow(shooting_cases)即可。 - 第二个代码:逻辑错误,
suburb_shootings[[x]] <- append(...)是将追加后的完整列表赋值给当前索引的元素,而非向列表追加元素。 - 第三个代码:函数内定义了局部的
suburb_shootings,未返回结果也未修改全局变量,外部无法获取处理后的数据。
正确写法
方法1:直接转换(最简洁)
无需循环,直接将列转换为列表:
suburb_shootings <- as.list(shooting_cases$BORO) # 或按列索引取 suburb_shootings <- as.list(shooting_cases[,4])
方法2:修正循环写法
如果一定要用循环实现,可修改为:
suburb_shootings <- list() total_rows <- nrow(shooting_cases) for(x in 1:total_rows){ suburb_shootings <- append(suburb_shootings, shooting_cases[x, "BORO"]) }
或在函数内正确处理全局变量:
suburb_shootings <- list() add_shootings_to_suburb_list <- function(){ total_rows <- nrow(shooting_cases) for(x in 1:total_rows){ suburb_shootings <<- append(suburb_shootings, shooting_cases[x, "BORO"]) } } add_shootings_to_suburb_list()
两种方法都会生成包含所有重复区名的列表,满足后续可视化需求。
内容的提问来源于stack exchange,提问作者Phillip Mackenzie
相关产品推荐
相关产品推荐

