R中tidyr::pivot_longer处理双精度列转换报错问题咨询
pivot_longer长宽表转换报错排查与修正
核心结论
pivot_longer原生支持双精度(double)类型数值列的转换,本次报错和列的数据类型完全无关,属于参数写法不符合函数规范导致的语法错误。
具体错误原因
cols参数的作用是指定需要被拉长转换的列范围,仅接受列位置、列名字符串、tidyselect选择规则(如contains()、starts_with()等列选择函数)作为输入,不支持传入完整的数据框对象。原代码中select(., contains("°C"))返回的是一个包含5列温度数据的完整tibble子集,将整块数据传入cols会直接触发“下标类型不合法”的报错。na.rm = TRUE是pivot_longer的顶层独立参数,作用是转换时自动丢弃值为NA的行,不能放在c()函数中和列选择规则混写。- 此前字符串类型数据集上相近写法能运行属于偶然情况,大概率是当时传入的对象被隐式转换为了列名向量,这种嵌套
select()的写法本身不符合函数参数规范,稳定性极差。
修正后可运行代码
library(dplyr) library(tidyr) # 复现用数据集 risk_by_device <- structure(list(device_id = c("412222", "C000037", "P000000", "W000043", "W000069", "W000075"), `< 12°C` = c(0, 0, 0, 0, 0, 0), `< 16°C` = c(0.355, 0, 0, 0, 0.359, 0), `< 18°C` = c(0.645, 0.048, 0.105, 0.057, 0.641, 0.036), `< 21°C` = c(0, 0.539, 0.62, 0.562, 0, 0.521), `> 21°C` = c(0, 0.412, 0.275, 0.38, 0, 0.443 )), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L)) # 正确转换代码 temp <- risk_by_device %>% tidyr::pivot_longer( cols = contains("°C"), names_to = "Score", values_to = "percentage", na.rm = TRUE )
转换效果说明
运行后将得到30行记录的长表(6台设备 × 5个温度区间),每一行对应单个设备在单个温度区间的占比数据,三列分别为设备IDdevice_id、温度区间Score、占比值percentage,所有双精度类型的占比数值会完整保留,无类型转换问题。
内容的提问来源于stack exchange,提问作者monkey
相关产品推荐
相关产品推荐

