在 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
此外,如果我们执行 profile
ing,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.frame
和 tibble
在保留 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
我想将数据框列转换为向量,其中的名称是动态的。 我只知道我想要第一列。
现在,我可以使用 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
此外,如果我们执行 profile
ing,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.frame
和 tibble
在保留 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