R语言 索引tibble会使数据类型无法检测

0pizxfdo  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(137)

我有以下建议:

test <- tibble(
  id = c("John","Jacob","Jingleheimer","Schmidt"),
  score = c(2,4,6,8)
)

变量"score"是一个数值,当我运行命令is.numeric时,我得到了以下结果:

> is.numeric(test$score)
[1] TRUE

但是当我尝试做同样的事情时,只是这一次是通过索引引用列,我得到了不同的输出:

> is.numeric(test[,2])
[1] FALSE

我很困惑为什么同一个命令的两个版本会得到如此不同的输出,为什么is.numeric在使用索引时检测不到数据类型?

rggaifut

rggaifut1#

索引对于tibble和data.frame的工作方式不同。请参见this

library(dplyr)
test <- tibble(
  id = c("John","Jacob","Jingleheimer","Schmidt"),
  score = c(2,4,6,8)
)
 
class(test[, 2])
## [1] "tbl_df"     "tbl"        "data.frame"

class(as.data.frame(test)[, 2])
## [1] "numeric"

基本区别在于 Dataframe 默认为drop = TRUE,而tibbles默认为drop = FALSE。

class(test[, 2])
## [1] "tbl_df"     "tbl"        "data.frame"

class(test[, 2, drop = FALSE]) # same
## [1] "tbl_df"     "tbl"        "data.frame"

class(test[, 2, drop = TRUE])
## [1] "numeric"

class(as.data.frame(test)[, 2])
## [1] "numeric"

class(as.data.frame(test)[, 2, drop = TRUE]) # same
## [1] "numeric"

class(as.data.frame(test)[, 2, drop = FALSE])
## [1] "data.frame"

另请注意

class(pull(test, 2))
## [1] "numeric"

class(test[[2]])
## [1] "numeric"

class(unlist(test[, 2]))
## [1] "numeric"

sapply(test, class)
##          id       score 
## "character"   "numeric"

相关问题