R根据字段名称/存在性导入数据集和管道创建变量的函数



我正在创建一个函数来自动导入多个数据集,并且在管道中分配变量值时遇到了困难。

任务:

我有20多个数据集需要导入,并计算和创建相同的变量。输入数据集包含相同的字段,除了一个字段的名称可以是三个可能值之一('varYEAR',其中'YEAR'是三个潜在年份之一(,但其基础数据属于相同类型。我试图将这个varYEAR向量的值分配给一个统一命名的变量"varXXXX",这样进一步的突变就可以引用后一个变量,而不必担心原始变量的名称。下面的代码经过了简化,以关注问题的关键。

当前示例代码/输出:

set_import <- function(input_path,year) {
temp_set <- read_table(input_path) %>%
mutate(MSAXXXX = ifelse(exists('var2003'),var2003,var2013))
}
View(temp_set)
var2003        varXXXX
1     41929          41929
2     33820          41929
3     27642          41929
4     88111          41929

对此,我尝试了几种不同的方法,包括:CCD_ 1以及在管道外用CCD_。每一个都产生了相同的输出集。

所需输出:

View(temp_set)
var2003        varXXXX
1     41929          41929
2     33820          33820          
3     27642          27642          
4     88111          88111          

我现在能推测的最好的情况是,"if"语句是基于单个检查的,出于某种原因,它用在所述检查中找到的第一个值填充varXXXX字段。我不知所措,非常感谢你的帮助!提前谢谢。

解决方案

只需使用正则表达式更改列名:

temp_set <- read_table(input_path)
names(temp_set) <- gsub(x = names(temp_set), pattern = "^(.+)(\d{4,4})$", replacement = "\1XXXX")

或者与dplyr工作流中的`names<-`()等效:

temp_set <- read_table(input_path) %>%
`names<-`(gsub(x = names(.), pattern = "^(.+)(\d{4,4})$", replacement = "\1XXXX"))

Regex

pattern = "^(.+)(\d{4,4})$"将每个名称分成两个捕获组:

  1. 任何长度为正的前缀:.+
  2. 某个年份由4位数字组成:\d{4,4}

然后replacement = "\1XXXX"将第一组(mutate(varXXXX = ifelse('var2003' %in% names(.),var2003,var2013))0(置于代码(XXXX(之前;所以代码本质上是";替换";这一年。

示例

这里有两种可能的情况,其中MSAXXXX列分别以MSA2003MSA2013开头:

case_1 <- data.frame(
MSA2003 = c(41929, 33820, 27642, 88111),
var2019 = c(41929, 33820, 27642, 88111),
other_var = 1:4
)
case_1
#>   MSA2003 var2019 other_var
#> 1   41929   41929         1
#> 2   33820   33820         2
#> 3   27642   27642         3
#> 4   88111   88111         4
case_2 <- data.frame(
MSA2013 = c(41929, 33820, 27642, 88111),
var2009 = c(41929, 33820, 27642, 88111),
other_var = 1:4
)
case_2
#>   MSA2013 var2009 other_var
#> 1   41929   41929         1
#> 2   33820   33820         2
#> 3   27642   27642         3
#> 4   88111   88111         4

请注意,该解决方案如何标准化名称中包含年份的所有变量,而不影响其他变量:

library(dplyr)
case_1 %>%
`names<-`(gsub(x = names(.), pattern = "^(.+)(\d{4,4})$", replacement = "\1XXXX"))
#>   MSAXXXX varXXXX other_var
#> 1   41929   41929         1
#> 2   33820   33820         2
#> 3   27642   27642         3
#> 4   88111   88111         4

case_2 %>%
`names<-`(gsub(x = names(.), pattern = "^(.+)(\d{4,4})$", replacement = "\1XXXX"))
#>   MSAXXXX varXXXX other_var
#> 1   41929   41929         1
#> 2   33820   33820         2
#> 3   27642   27642         3
#> 4   88111   88111         4

最新更新