使用dplyr按列名参数进行选择

5

我有一个数据表,有很多列,看起来像这样:

sd1_scale1 sd1_scale2 sd1_scale3 ... sd2_scale1 sd2_scale2 ... 等等

我使用dplyr处理这些数据,并使用select进行如下选择:

  select(code_group, sd1_scale1:sd1_scale13)

我希望编写一个函数,它接受一个数字(SD号码),并根据此选择列,类似于以下内容:
 makeData <- function(sdNumber) {

       return select(code_group, sd{sdNumber}_scale1:sd{sdNumber}_scale13)

    }

使用dplyr可以实现吗?我尝试传递列的索引到select函数中,但失败了,不知道该怎么做。谢谢!


1
请使用 pasteselect_ - Gregor Thomas
据我所知,paste 在 R 中用于连接字符串,而在帮助文档中我没有找到 select_ 函数,也许你的意思是 select_vars?那么如何将表达式 sd1_scale1:sd1_scale13 传递给 select_vars 呢? - Dmitry Malugin
1
确保您的 dplyr 已经更新到最新版本。select_()select() 的一个版本,它接受字符串作为参数。几乎每个 dplyr 函数都有一个以下划线结尾的版本,它期望字符串作为参数。 - Gregor Thomas
1个回答

11

你可以像Gregor建议的那样使用select_,但不是必须的。

library(dplyr)

x <- read.csv(text = "sd1_scale1,sd1_scale2,sd1_scale3,sd2_scale1,sd2_scale2,sd2_scale3
1,2,3,4", header = TRUE)


makeData1 <- function(x, sdNumber) {
  # Using `one_of` as explained in ?select
  select(x, one_of(paste0("sd", sdNumber, "_scale", 1:2)))
}

makeData2 <- function(x, sdNumber) {
  # Same effect using nonstandard evaluation, see vignette("nse")
  select_(x, .dots = paste0("sd", sdNumber, "_scale", 1:2))
}

x %>% makeData1(2)    
x %>% makeData2(2) # same result
我从这篇要点中获取了这个信息。

太棒了!你的解决方案甚至在非常复杂的链式情况下都有效。非常感谢! - Dmitry Malugin
我在设置x时遇到了错误:“扫描文件时出错...第1行没有6个元素”。 - Mike Honey
1
@MikeHoney 复制/粘贴制表符很困难。我已将它们更改为逗号。 - nacnudus

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