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

标签 r regex if-statement string-parsing

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

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

假设数据帧是 eatable

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")

我试图编写一个函数来匹配循环中的字符串,并在匹配列名中的前 5 个字母后存储子集列。
checkExpression <- function(dataset,str){
    dataset[grepl((str),names(dataset),ignore.case = TRUE)]
}

checkExpression(eatable,"your_string")

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

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

最佳答案

你可以试试:

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)

关于r - 基于同一数据框中列名部分匹配的子集列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203068/

相关文章:

r - 具有分类数据的栅格 map 图例

r - 图节点之间的乘法距离

r - 线性混合建模可以处理响应变量和/或预测变量中的 NA(缺失数据)吗?

java - 在Java中使用正则表达式过滤单词

Javascript 部分号码匹配

python - 正则表达式:特殊字符之间的数字(但不是所有数字)

Python - 检查类是否存在

javascript - 如何同时使用 if 和 while Javascript 设置 3 个条件

c# - 如何修复验证以使其更好?

r - 仅显示 R 中的 leaflet 包使用的 map 上的点