Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R函数或循环,用于重复选择满足条件的行、另存为单独的对象以及重命名列标题_R_Function_Loops_Subset - Fatal编程技术网

R函数或循环,用于重复选择满足条件的行、另存为单独的对象以及重命名列标题

R函数或循环,用于重复选择满足条件的行、另存为单独的对象以及重命名列标题,r,function,loops,subset,R,Function,Loops,Subset,我有16个关于路线周围土地覆盖变化的大型数据集。示例数据集“Trial1”: 我想首先选择满足条件的行,例如,列“TYPE”中的所有行都是cls_21。我知道以下代码可以执行此操作: Trial21 <-subset(Trial1, TYPE==" cls_21 ") 我想重命名此子集中的列,以便它们通过在现有列名后面添加“L21”来唯一标识类,我可以使用 library(data.table) setnames(Trial21, old = c('CA', 'PLA

我有16个关于路线周围土地覆盖变化的大型数据集。示例数据集“Trial1”:

我想首先选择满足条件的行,例如,列“TYPE”中的所有行都是cls_21。我知道以下代码可以执行此操作:

Trial21 <-subset(Trial1, TYPE==" cls_21 ")
我想重命名此子集中的列,以便它们通过在现有列名后面添加“L21”来唯一标识类,我可以使用

library(data.table)
setnames(Trial21, old = c('CA', 'PLAND', 'NP', 'PD', 'LPI', 'TE', 'ED', 'LSI'), 
         new = c('CAL21', 'PLANDL21', 'NPL21', 'PDL21', 'LPIL21', 'TEL21', 'EDL21', 'LSIL21'))
我想帮助开发一个函数或循环,使这个过程自动化,这样我就不必花费数天的时间为15个不同的类和16个数据集重复相同的代码(240次)。此外,还要降低出错的风险。对于其他数据集,我可能也必须这样做。我们将非常感谢您对加快流程的任何帮助。

您可以:

a <- split(df, df$TYPE)

b <- sapply(names(a), function(x)setNames(a[[x]],
              paste0(names(a[[x]]), sub(".*_", 'L', x))), simplify = FALSE)

a以下是一个适用于您的示例的开始:

library(dplyr)

myfilter <- function(data, number) {
  data %>%
    filter(TYPE == sprintf(" cls_%s ") %>%
    rename_with(\(x) sprintf("%s%s", x, suffix), !1:2)
}

myfilter(example_data, 21)

您可以使用
ls
获取数据集的变量名,并在循环中使用
get
功能按需操作它们,然后使用
assign
创建新的数据集

sets = grep("Trial", ls(), value=TRUE) #Assuming every dataset has "Trial" in the name

for(i in sets){
  classes = unique(get(i)$TYPE)
  
  for(j in classes){
    number = gsub("(.+)([0-9]{2})( )", "\\2", j)#this might be an overly complicated way of getting just the number, you can look for better options if you want
    assign(paste0("Trial", number),
           subset(Trial1, TYPE==j) %>% rename_with(function(x){paste0(x, number)}))}}

了解一下:格式有多标准化是很有用的?即,要重命名的列是否始终位于相同的位置?是否只有类型选择器中的数字会改变,或者您需要该函数有多灵活?是的,各列在数据集中的位置相同,并且以相同的名称开始。只有数字会在类型选择器中更改,所有数字都是2位数字(范围为11-95)。当重命名列时,新列名将有“L”或“R”,后跟与名称末尾添加的类型相关的两位数。我相应地更改了答案。
library(dplyr)

myfilter <- function(data, number) {
  data %>%
    filter(TYPE == sprintf(" cls_%s ") %>%
    rename_with(\(x) sprintf("%s%s", x, suffix), !1:2)
}

myfilter(example_data, 21)
multifilter <- function(data) {
  purrr::map(21:31, \(i) myfilter(data, i))
}

multifilter(example_data)
purrr::map(list_of_dataframes, multifilter)
sets = grep("Trial", ls(), value=TRUE) #Assuming every dataset has "Trial" in the name

for(i in sets){
  classes = unique(get(i)$TYPE)
  
  for(j in classes){
    number = gsub("(.+)([0-9]{2})( )", "\\2", j)#this might be an overly complicated way of getting just the number, you can look for better options if you want
    assign(paste0("Trial", number),
           subset(Trial1, TYPE==j) %>% rename_with(function(x){paste0(x, number)}))}}