为何子集化tibble后spec()返回NULL?如何避免该问题?
问题原因
用readr::read_csv()读入数据时,生成的tibble会自带一个叫spec的自定义属性,专门存储列的解析规范。但base R的subset()函数(包括直接按索引/列名挑列的操作)生成子集时,会创建一个全新的普通tibble/data.frame,不会保留原数据的这个自定义spec属性,所以调用spec()就返回NULL了。
保留列规范的方法
有两种实用的解决办法:
1. 用tidyverse的选择函数替代base R操作
用dplyr::select()来选列,tidyverse的函数会自动保留tibble的自定义属性,包括spec:
library(dplyr) steps_sub <- select(steps, 1, 5, 10, 11, 12, 17) spec(steps_sub)
这样就能拿到选中列对应的规范信息。
2. 手动提取并设置spec属性
如果非得用base R的操作,可以先把原数据的spec提出来,筛选出对应列的规范,再手动给子集赋值:
# 提取原数据的列规范 original_spec <- spec(steps) # 生成子集 steps_sub <- subset(steps, select = c(1, 5, 10, 11, 12, 17)) # 给子集设置对应列的spec属性 attr(steps_sub, "spec") <- original_spec[names(steps_sub)] # 验证 spec(steps_sub)
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

