首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在r中,将数据帧的列转换为没有"unlist“且具有动态名称的向量。

在r中,将数据帧的列转换为没有"unlist“且具有动态名称的向量。
EN

Stack Overflow用户
提问于 2019-07-20 15:44:30
回答 2查看 54关注 0票数 1

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

现在,我可以用unlist实现这一点,但是它比按名称访问慢了大约两个数量级:

代码语言:javascript
复制
df = data_frame(x = 3, y = 4)
microbenchmark::microbenchmark({df$x}) #less than 1 microsecond
microbenchmark::microbenchmark({unlist(df[,1}) #about 15 microseconds!

如果我事先不知道列的名称,还有比取消列表更有效的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-20 15:46:54

原因是df[,1]仍然是一个只有一列的tibble。

代码语言:javascript
复制
str(df[,1])
#Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  1 obs. of  1 variable:
# $ x: num 3

我们需要df[[1]]来提取列。因此,它分两个步骤进行操作,[,1]unlist

此外,如果我们执行profile执行,unlist步骤将占用更多的内存和时间。

代码语言:javascript
复制
library(profvis)
df <- tibble(x = 1:1e7, y = 1:1e7)

profvis({

   df1 <- df[,1]
   unlist(df1)



})

代码语言:javascript
复制
profvis({
  df1 <- df %>%
          select(x)
  unlist(df1)

})

并与

代码语言:javascript
复制
profvis({
    df %>%
       pull(x)
   })

代码语言:javascript
复制
profvis(df$x)

注意:这些操作速度太快,甚至在专业人员对其进行操作之前就完成了,从而导致了错误。

票数 3
EN

Stack Overflow用户

发布于 2019-07-25 22:37:48

还值得注意的是,data.frametibble在如何保存对象的维度方面存在差异。如果要在单个列上定义数据帧和子集,它将返回一个向量:

代码语言:javascript
复制
df <- data.frame(x = 3, y = 4)

df[,1]
#[1] 3

而在默认情况下,tibble并不会简化:

代码语言:javascript
复制
df <- tibble(x = 3, y = 4)

df[,1]
#  A tibble: 1 x 1
#      x
#   <dbl>
# 1     3

如果我们想让tibble简化,我们可以使用[[子集提取单个列,这确实简化为一个向量,或者我们可以指定drop = T

代码语言:javascript
复制
df <- tibble(x = 3, y = 4)

df[,1, drop = T]
# [1] 3

df[[1]]
# [1] 3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57126255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档