使用dplyr和select_()从数据框中选择列的选择列表

4

我正在尝试使用以下函数从数据框中提取一些列:

library('dplyr')
desired_columns = c(
  'a',
  'b',
  'c')
extract_columns <- function(data) {
  extracted_data <- data %>%
    select_(desired_columns)
  return(extracted_data)
}

但是当我尝试时,我得不到我期望的结果:
> df <- data.frame(a=1:5, b=1:5, c=1:5, d=1:5)
> df
  a b c d
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5
> extract_columns(df)
  a
1 1
2 2
3 3
4 4
5 5

我似乎只得到了第一列,但我想不出我做错了什么。我该如何获取所有请求的列?


5
在我看来,这完全是胡说八道。为什么要用 dplyr 创建如此复杂的函数?而简单的 df[desired_columns] 又有什么不好?这是 R 中最基本的子集操作。 - David Arenburg
这是我为了这个问题构建的一个最小代码片段,但问题的核心是如何使用select_()和列列表,这真正是我想要的答案。 - mrestko
3个回答

9
您只是在select_函数中缺少.dots参数:
extract_columns <- function(data) {
    extracted_data <- data %>%
        select_(.dots = desired_columns)
    return(extracted_data)
}

extract_columns(df)
  a b c
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5

4

tibble是tidyverse/dplyr中的数据框版本。由于select()是dplyr函数,因此您可以将数据框转换为tibble,并使用变量列表直接使用select来返回另一个tibble。

df = data.frame(a=1:5, b=1:5, c=1:5, d=1:5)
desired_columns = c( 'a', 'b', 'c')
df %>% as_tibble() %>% select(desired_columns)

3
在这种情况下,您需要使用.dots参数来传递向量(或列表):select_(.dots = desired_columns)。看起来似乎与懒惰有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接