r - 如何从 df 中对多个列进行子集化,包括 grep match

标签 r dataframe match subset partial

我有一个非常大的数据集,其中包括多个名称具有共同部分的列(例如 ctq_1、ctq_2、ctq_3 以及 panas_1、panas_2、panas_3)。我想将其中一些列(例如,仅那些列名称中包含“panas”的列)与同一数据框中具有唯一名称(例如 id、group)的某些其他列一起进行子集化。

我尝试在方括号内使用 grep 函数,效果很好: panas <- bigdata[ , grep('panas', colnames(bigdata))] 但现在我需要弄清楚如何包含我需要的其他两列,即 id 和 group。我试过: panas <- bigdata[ , c('id', 'group', grep('panas', colnames(bigdata)))] 但我收到此错误: 错误:找不到列 114115116117118 >, ...(以及 15 个以上)在 .data 中。 调用 rlang::last_error() 来查看回溯。

如何用最简单的代码实现我想要的目标?我是 R 新手,所以最好避免使用花哨的函数!

这是一个可重现的示例。


> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> newframe <- iris[ , grep('Petal', colnames(iris))] # This works

> newframe <- iris[ , c('Species', grep('Petal', colnames(iris)))] # This doesn't work

这次的错误是:

Error in [.data.frame(iris, , c("Species", grep("Petal", colnames(iris)))) : undefined columns selected

最佳答案

假设我了解您想要做什么,可能的解决方案可能没有用和/或可能是多余的:

my_selector <- function(df,partial_name,...){
  positional_names <- match(...,names(df))
  df[,c(positional_names,grep(partial_name,names(df)))]
}
my_selector(iris, partial_name = "Petal","Species")

一个“更简单”的选项是使用 grep 等来立即匹配目标名称:

iris[grep("Spec.*|Peta.*", names(iris))]

或者更简单,按照@akrun的建议,我们可以简单地这样做:

iris[grep("(Spec|Peta).*", names(iris))]

对于更多列,我们可以这样做:

my_selector(iris, partial_name = "Petal",c("Species","Sepal.Length"))
       Species Sepal.Length Petal.Length Petal.Width
1       setosa          5.1          1.4         0.2
2       setosa          4.9          1.4         0.2

请注意但是,在上述函数中,列的选择与直觉相反,因为首先选择最后提供的名称。

第一部分的结果(截断):

         Species Petal.Length Petal.Width
1       setosa          1.4         0.2
2       setosa          1.4         0.2
3       setosa          1.3         0.2
4       setosa          1.5         0.2
5       setosa          1.4         0.2
6       setosa          1.7         0.4
7       setosa          1.4         0.3

关于r - 如何从 df 中对多个列进行子集化,包括 grep match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58281231/

相关文章:

Java 正则表达式 : check if a sentence contains only alphabet and numbers

r - 在 R 中一次生成多个频率表

python - 如何找到一个系列中多个组的总和?

Python 3.4 - Pandas - 帮助正确排列数据框列和删除无效列

r - 如何标准化同一列中的混合日期格式

r-在向量中找到两个最接近的值

ruby - 如何返回具有重复元素的 Ruby 数组交集? (骰子系数中的二元组问题)

r - lapply 与 gregexpr 和字符向量

r - 在 GLM 准规范中使用变量

r - 如何返回 R 中数据帧每列按行排列的多个标准统计数据的 'untidy' 数据帧摘要?