所以,我有一个包含向量列和列表列的 tibble。
使用 dplyr 可以轻松选择列表列:
select_if(tb, is.list)
但它与 !
或 -
的否定不起作用编辑,这 select_if(tb,function(x)! is.list(x))
所以我想我可以做这样的事情:
select(tb, which(!apply(tb,2,is.list))
这将返回无列。因为显然(这里是表示),tibble 列上的 is.list
总是返回 true,即使对于向量列(?)。
df <- data.frame(A = runif(100))
tb <- tibble(A = runif(100))
is.list(df$A)
# FALSE
is.list(tb$A)
# FALSE
is.list(df[,1])
# FALSE
is.list(tb[,1])
# TRUE
有人能解释一下这里发生了什么吗?
最佳答案
因为 tibble 的默认 drop 参数为 FALSE
,这意味着当您仅从 dataframe 中提取一列时,它会返回一个数字向量,而当您从 tibble 中提取一列时,它会返回一列 tibble。
检查他们的类(class)。
class(df[, 1])
#[1] "numeric"
class(tb[, 1])
#[1] "tbl_df" "tbl" "data.frame"
如果您在数据框中添加drop = FALSE
,它将返回一个数据框。
class(df[, 1, drop = FALSE])
#[1] "data.frame"
数据框/tibble 列仍然是一个列表。
is.list(tb[, 1])
#[1] TRUE
is.list(df[, 1, drop = FALSE])
#[1] TRUE
因此,要回答您的问题,是的,is.list
总是在 tibble 上返回 TRUE
,除非您在一列上明确提及 drop = TRUE
蒂 bool 。
is.list(tb[, 1, drop = TRUE])
#[1] FALSE
关于r - is.list 在 tibble 列上总是返回 true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61362319/