R语言打印数据集指定行范围报列不存在错误问题咨询
R管道操作打印指定行范围报错修复方案
问题复现
你当前使用的代码如下:
INDIANA.LONG <- INDIANA %>% pivot_longer(X2010:X2019, names_to = "YEARS", values_to = "COUNT") %>% print[75:83,]
运行后返回报错:
Error in `vectbl_as_col_location()`: ! Can't subset columns past the end. ℹ Locations 75, 76, 77, 78, 79, … don't exist. ℹ There are only 6 columns.
报错原因
核心问题是print[75:83,]属于语法错误:
print是R的内置函数,不是可索引的数据对象,不能直接在函数名后加方括号[]做切片- 该错误写法会让R把你传入的
75:83位置参数识别为列索引,而你的数据集总共只有6列,因此触发“列索引超出范围”的报错。
正确写法
根据你的需求(完成长表转换赋值,同时打印75-83行内容),有两种常用实现方式:
方式1:管道流程内直接打印(不影响最终赋值的完整数据)
用T形管道%T>%(加载tidyverse/dplyr后可直接使用),该操作符会先执行右侧的打印操作,再把前一步生成的完整长表数据赋值给左侧变量,不会因为切片丢失数据:
# 用base R风格索引打印 INDIANA.LONG <- INDIANA %>% pivot_longer(X2010:X2019, names_to = "YEARS", values_to = "COUNT") %T>% print(.[75:83, ])
如果习惯用tidyverse风格的行选择语法,可以搭配专门用于按行号筛选的slice()函数,不需要手动写行列索引的逗号,更不容易出错:
# 用dplyr::slice选行打印 INDIANA.LONG <- INDIANA %>% pivot_longer(X2010:X2019, names_to = "YEARS", values_to = "COUNT") %T>% slice(75:83) %>% print()
方式2:先完成赋值再单独打印
如果不需要把打印逻辑嵌在管道里,可以拆成两步写,逻辑更直白:
# 第一步:完成长宽转换,把完整长表赋值给变量 INDIANA.LONG <- INDIANA %>% pivot_longer(X2010:X2019, names_to = "YEARS", values_to = "COUNT") # 第二步:打印指定行范围 print(INDIANA.LONG[75:83, ])
语法注意点
- 普通
%>%管道会把前一步的输出作为下一个函数的第一个参数传入,如果要在函数里引用前一步的完整数据对象,需要用.占位 - 方括号
[]仅用于对向量、数据框、列表等数据对象做切片,不能直接接在函数名后使用 - 对tibble格式的数据集做切片时,
[行索引, 列索引]的顺序不能搞反,省略列索引即代表选中所有列。
内容的提问来源于stack exchange,提问作者Spencer
相关产品推荐
相关产品推荐

