如何解释此错误消息:( list)对象无法强制键入' double'

时间:2017-11-30 21:21:44

标签: r dataframe dplyr

我有一个表:numTable,如下所示: enter image description here

现在我想找到每个列的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之间的区别有关吗? 感谢。

1 个答案:

答案 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