在 r 中将数据框的列转换为不带 "unlist" 且具有动态名称的向量

in r convert a column of a data frame to a vector without "unlist" and with a dynamic name

我想将数据框列转换为向量,其中的名称是动态的。 我只知道我想要第一列。

现在,我可以使用 unlist 执行此操作,但它比通过名称访问慢两个数量级:

df = data_frame(x = 3, y = 4)
microbenchmark::microbenchmark({df$x}) #less than 1 microsecond
microbenchmark::microbenchmark({unlist(df[,1}) #about 15 microseconds!

如果我事先不知道列的名称,有没有比 unlist 更有效的方法?

原因是df[,1]仍然是一栏小标题。

str(df[,1])
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  1 obs. of  1 variable:
# $ x: num 3

我们需要 df[[1]] 来提取列。所以,它分两步进行操作,[,1]然后unlist


此外,如果我们执行 profileing,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)

注意:这些太快了,甚至在 profvis 对其采取行动之前就完成了,导致错误

还值得注意的是,data.frametibble 在保留 object 尺寸的方式上有所不同。如果我们要在单个列上定义数据框和子集,它将 return 一个向量:

df <- data.frame(x = 3, y = 4)

df[,1]
#[1] 3

虽然小标题默认不简化:

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] 3