子集列基于同一数据框中列名的部分匹配

时间:2016-10-23 12:46:41

标签: r regex if-statement string-parsing

我想了解如何通过将列名的前5个字母相互匹配来从同一数据框中对多个列进行子集,如果它们相等,则将其子集化并将其存储在新变量中。

这是我所需输出的一个小解释。它在下面描述,

假设数据框为level1 level2 level3 level4 level5 level6 level7 level8 descr 143 CEO 038 DIRECTOR 0418 ADVISOR 114 DG 346 Manager 202 Lead

eatable

我试图编写一个与循环中的字符串匹配的函数,并在匹配列名的前5个字母后存储子集列。

fruits_area   fruits_production  vegetable_area   vegetable_production 

12             100                26               324
33             250                40               580
66             510                43               581

eatable <- data.frame(c(12,33,660),c(100,250,510),c(26,40,43),c(324,580,581))
names(eatable) <- c("fruits_area", "fruits_production", "vegetables_area",
          "vegetable_production")

上面的函数正确检查了字符串,但我很困惑如何在数据集中的列名之间进行匹配。

编辑: - 我认为正则表达式可以在这里工作。

3 个答案:

答案 0 :(得分:4)

你可以尝试:

v <- unique(substr(names(eatable), 0, 5))
lapply(v, function(x) eatable[grepl(x, names(eatable))])

或使用map() + select_()

library(tidyverse)
map(v, ~select_(eatable, ~matches(.)))

给出了:

#[[1]]
#  fruits_area fruits_production
#1          12               100
#2          33               250
#3         660               510
#
#[[2]]
#  vegetables_area vegetable_production
#1              26                  324
#2              40                  580
#3              43                  581

你想把它变成一个函数:

checkExpression <- function(df, l = 5) {
  v <- unique(substr(names(df), 0, l))
  lapply(v, function(x) df[grepl(x, names(df))])
}

然后简单地使用:

checkExpression(eatable, 5)

答案 1 :(得分:1)

我相信这可能会满足您的需求:

void called_one(const int& x)
{
    const_cast<int&>(x) = 2; // Legal (and illegal if the `x` passed is actually `const`)
}

请注意checkExpression <- function(dataset,str){ cols <- grepl(paste0("^",str),colnames(dataset),ignore.case = TRUE) subset(dataset,select=colnames(dataset)[cols]) } 添加了"^"

使用您的数据:

grepl

答案 2 :(得分:0)

你的功能正是你想要的,但是有一个小错误:

checkExpression <- function(dataset,str){
  dataset[grepl((str),names(dataset),ignore.case = TRUE)]
}

更改从objedataset的子集的对象名称。

checkExpression(eatable,"fr")
#  fruits_area fruits_production
#1          12               100
#2          33               250
#3         660               510

checkExpression(eatable,"veg")
#  vegetables_area vegetable_production
#1              26                  324
#2              40                  580
#3              43                  581