我正在創建一個函式來自動匯入多個資料集,并且在管道中分配變數值時遇到了困難。
任務:
我有 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
我已經嘗試了幾種不同的方法,包括:
mutate(varXXXX = ifelse('var2003' %in% names(.),var2003,var2013))以及在管道之外使用temp_set$MSAXXXX = as.character(ifelse('var2003' %in% names(temp_set),temp_set$var2003,var2013)). 每個都產生了上面相同的輸出集。
期望的輸出:
View(temp_set)
var2003 varXXXX
1 41929 41929
2 33820 33820
3 27642 27642
4 88111 88111
我現在可以推測的最好的結果是“if”陳述句是基于單個檢查的,并且由于某種原因,它使用在所述檢查中找到的第一個值填充 varXXXX 欄位。我很茫然,非常感謝一些幫助!提前致謝。
uj5u.com熱心網友回復:
解決方案
只需使用正則運算式更改列名:
temp_set <- read_table(input_path)
names(temp_set) <- gsub(x = names(temp_set), pattern = "^(. )(\\d{4,4})$", replacement = "\\1XXXX")
或者等效`names<-`()地在dplyr作業流程中:
temp_set <- read_table(input_path) %>%
`names<-`(gsub(x = names(.), pattern = "^(. )(\\d{4,4})$", replacement = "\\1XXXX"))
正則運算式
將pattern = "^(. )(\\d{4,4})$"每個名稱分成兩個捕獲組:
- 任何正長度前綴:
. - 某年由
4數字組成:\\d{4,4}
然后replacement = "\\1XXXX"將第一組 ( \\1) 添加到代碼 ( XXXX); 所以代碼基本上“替換”了年份。
例子
以下是兩種可能的情況,MSAXXXX列分別以 asMSA2003和 as開頭MSA2013:
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/418389.html
標籤:
下一篇:過濾鏡像分隔符未配對的行
