现在我想找到每个列的outiers。请参阅下面的代码:
for (i in names(numTable)) {
#calculate mean and std for each column
meanValue <- mean(numTable[,i], na.rm=TRUE)
stdValue<-sd(numTable[,i],na.rm=TRUE)
#Sum up number of outliers for each column
print(paste("there are",sum(abs(numTable[,i]-meanValue)>3*stdValue,na.rm =
TRUE),"outliers in the column",i))
}
但我收到错误消息:
Error in is.data.frame(x) : (list) object cannot be coerced to type 'double'
我通过在开头添加numTable<-as.data.frame(numTable)
来解决此问题。
你能否告诉我为什么我必须为我的代码添加这一行?它与tbl和data.frame之间的区别有关吗?
感谢。
答案 0 :(得分:4)
方括号索引data.frames
中有一个名为drop
的隐藏参数,默认为TRUE
,并说如果索引一列,请尝试将结果简化为向量。见?'['
。
然而,Hadley Wickham认为这是不可预测的行为,因此tbl
强制执行drop = FALSE
。
如果您想继续使用tbl
并避免转换为data.frame
。您可以使用dplyr::pull
将单个列提取为向量。即:
is.vector(data.frame(a = 1:10, b = letters[1:10])[, 1])
#> [1] TRUE
is.vector(data.frame(a = 1:10, b = letters[1:10])[, 1, drop = FALSE])
#> [1] FALSE
is.vector(dplyr::tibble(a = 1:10, b = letters[1:10])[, 1])
#> [1] FALSE
is.vector(dplyr::pull(dplyr::tibble(a = 1:10, b = letters[1:10]), 1))
#> [1] TRUE