我想了解如何通过将列名的前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")
上面的函数正确检查了字符串,但我很困惑如何在数据集中的列名之间进行匹配。
编辑: - 我认为正则表达式可以在这里工作。
答案 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)]
}
更改从obje
到dataset
的子集的对象名称。
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