循环计算多列IQR报错:列表无法转为双精度类型
问题:tbl_df数据集计算直方图binwidth时IQR函数报错
需求:计算所有数值列的IQR和行数,代入Freedman-Diaconis公式计算直方图binwidth,再用ggplot批量绘制直方图。使用iris数据集时代码正常运行:
datai = iris %>% filter(Species == "virginica")%>% select(-Species) for (i in colnames(datai)) { bw = (2* IQR(datai[,i], na.rm = T)/ length(datai[,i])^(1/3)) plot= ggplot(datai, aes(x= .data[[i]]))+ geom_histogram(binwidth = bw) print(plot) }
但使用自定义tbl_df格式数据集时,IQR函数报错,最小复现代码:
#MWE datah = structure(list(DBP = c(74.667, 78.6666666666667, 82, 73, 78.6666666666667, 68.6667), SBP = c(134, 114.666666666667, 126, 161, 126, 141.333 )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" )) for (i in colnames(datah)) { bw = (2* IQR(datah[,i], na.rm = T) )/ length(datah[,i])^(1/3) ggp3 <- ggplot(datah, aes(x = .data[[i]] )) + geom_histogram( binwidth = bw) print(ggp3) }
报错信息:
Error in quantile(as.numeric(x), c(0.25, 0.75), na.rm = na.rm, names = FALSE, :
'list' object cannot be coerced to type 'double'
原因分析
普通data.frame用[,i]提取列时返回数值向量,但tbl_df(tibble)用[,i]提取列返回的是单列tibble(本质为列表结构),而IQR()函数需要输入数值向量,因此无法将列表转换为数值型,触发报错。
解决方案
修改列提取方式,确保获取数值向量,两种可选方法:
方法1:用[[代替[,提取列
直接通过[[获取向量:
for (i in colnames(datah)) { bw = (2* IQR(datah[[i]], na.rm = T) )/ length(datah[[i]])^(1/3) ggp3 <- ggplot(datah, aes(x = .data[[i]] )) + geom_histogram( binwidth = bw) print(ggp3) }
方法2:使用dplyr的pull()函数
若习惯dplyr语法,用pull()提取列向量:
library(dplyr) for (i in colnames(datah)) { col_vector <- pull(datah, i) bw = (2* IQR(col_vector, na.rm = T) )/ length(col_vector)^(1/3) ggp3 <- ggplot(datah, aes(x = .data[[i]] )) + geom_histogram( binwidth = bw) print(ggp3) }
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

