我想将数据帧列转换为向量,其中的名称是动态的。我只知道我要的是第一列。
现在,我可以用unlist实现这一点,但是它比按名称访问慢了大约两个数量级:
df = data_frame(x = 3, y = 4)
microbenchmark::microbenchmark({df$x}) #less than 1 microsecond
microbenchmark::microbenchmark({unlist(df[,1}) #about 15 microseconds!如果我事先不知道列的名称,还有比取消列表更有效的方法吗?
发布于 2019-07-20 15:46:54
原因是df[,1]仍然是一个只有一列的tibble。
str(df[,1])
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 1 obs. of 1 variable:
# $ x: num 3我们需要df[[1]]来提取列。因此,它分两个步骤进行操作,[,1]和unlist。
此外,如果我们执行profile执行,unlist步骤将占用更多的内存和时间。
library(profvis)
df <- tibble(x = 1:1e7, y = 1:1e7)
profvis({
df1 <- df[,1]
unlist(df1)
})

profvis({
df1 <- df %>%
select(x)
unlist(df1)
})并与
profvis({
df %>%
pull(x)
})或
profvis(df$x)注意:这些操作速度太快,甚至在专业人员对其进行操作之前就完成了,从而导致了错误。
发布于 2019-07-25 22:37:48
还值得注意的是,data.frame和tibble在如何保存对象的维度方面存在差异。如果要在单个列上定义数据帧和子集,它将返回一个向量:
df <- data.frame(x = 3, y = 4)
df[,1]
#[1] 3而在默认情况下,tibble并不会简化:
df <- tibble(x = 3, y = 4)
df[,1]
# A tibble: 1 x 1
# x
# <dbl>
# 1 3如果我们想让tibble简化,我们可以使用[[子集提取单个列,这确实简化为一个向量,或者我们可以指定drop = T。
df <- tibble(x = 3, y = 4)
df[,1, drop = T]
# [1] 3
df[[1]]
# [1] 3https://stackoverflow.com/questions/57126255
复制相似问题