我有一組具有不同前綴和后綴的變數。有兩種型別。一種型別只有前綴。第二種型別有前綴,然后是數字,然后是后綴。每種型別中的數字都是無序的。這是兩種型別的一些示例代碼
VarNamesType1 <- paste0( "Prefix1" , c(2,1,44,22))
VarNamesType1>
[1] "Prefix12" "Prefix11" "Prefix144" "Prefix122"
這是帶有前綴和后綴的變數名稱
VarNamesType2 <- paste0( "Pre2" , c(9,3,5,7) , "Suffix2")
VarNamesType2>
[1] "Pre29Suffix" "Pre23Suffix2" "Pre25Suffix2" "Pre27Suffix2"
有沒有辦法在這些變數型別串列中找到唯一值。因此,對于 VarNamesType1,使用代碼查找值 2,1,44,22,對于 VarNamesType2 使用代碼查找 9,3,5,7。是否可以使用相同的代碼找到兩種型別的唯一編號?任何想法或建議將不勝感激。謝謝
EDIT1-感謝展示解決方案的海報洗掉所有文本。但是前綴和后綴也可以包含數字。因此,洗掉文本將不起作用。我已經更新了示例代碼。
EDIT2- 我現在已經能夠使用它來查找前綴部分。我不確定如何找到后綴部分。
find_common_start <- function(strings) {
max_length = min(nchar(strings))
for(len in max_length:1) {
if(length(unique(substr(strings, start = 1, stop = len))) == 1) {
return(substr(strings[[1]], start = 1, stop = len))
}
}
}
> find_common_start(VarNamesType1)
[1] "Prefix1"
find_common_start(VarNamesType2)
[1] "Pre2"
這可以適應做后綴嗎?
uj5u.com熱心網友回復:
我們可以使用readr::parse_number, 或洗掉所有字母或使用正則運算式提取所有數字。
和 parse_number
readr::parse_number(VarNamesType1)
[1] 2 1 44 22
readr::parse_number(VarNamesType2)
[1] 9 3 5 7
使用正則運算式
stringr::str_extract(VarNamesType2, '\\d ') |>
as.integer()
[1] 9 3 5 7
示例資料中的所有值都已經是唯一的,但是如果我們對任何資料集的唯一值感興趣,我們可以將輸出通過管道傳輸到 中unique(),如下所示:
readr::parse_number(VarNamesType1) |> unique()
編輯
OP 告知后綴和前綴可能有數字。在這種情況下, parse_number() 將不起作用,我們將不得不使用基于正則運算式的方法。
我們必須有一致的“前綴”或“后綴”模式才能做到這一點。我們可以使用stringr::str_remove_all, 洗掉前綴或后綴,并用“|”折疊它們:
library(glue)
library(stringr)
prefix<-'Pre2'
suffix<-'Suffix2'
str_remove_all(VarNamesType2, glue('^{prefix}|{suffix}$')) |>
as.integer()
[1] 9 3 5 7
uj5u.com熱心網友回復:
我終于明白了這個問題。要檢查常量(前綴和后綴)之間的唯一值,我們可以首先將字串拆分為單個字符,然后洗掉長度為 ==1 的串列元素purrr::pmap
library(purrr)
pmap(strsplit(VarNamesType2, ''), ~unique(c(...)))%>%
keep(~length(.x) > 1) %>%
unlist()%>%
as.integer()
[1] 9 3 5 7
uj5u.com熱心網友回復:
我最終寫了這個,它回答了我自己的問題。
find_unique <- function(FindUnique) {
max_presuffix = min( nchar( FindUnique ) )
for ( i in 1:max_presuffix ) {
if( length( unique( substr( FindUnique , start = 1, stop = i) ) ) == 1 ) {
prefix <-(substr( FindUnique[[1]], start = 1, stop = i )) }
if( length( unique( substr( FindUnique, start = nchar(FindUnique) - i , stop = nchar( FindUnique ) ) ) ) == 1 ) {
suffix <-(substr( FindUnique[[1]], start = nchar( FindUnique )- i , stop = nchar( FindUnique )[1] ) ) }
}
if (exists("prefix")){ FindUnique <- sub( prefix ,"", FindUnique ) }
if (exists("suffix")){FindUnique <- sub( suffix ,"", FindUnique ) }
return( FindUnique )
}
> find_unique(VarNamesType1)
[1] "2" "1" "44" "22"
> find_unique(VarNamesType2)
[1] "9" "3" "5" "7"
uj5u.com熱心網友回復:
一個有效的(雖然是一個令人費解的)tidyverse 答案。這依賴于將字串拆分為單個字符的串列,然后找到在自然順序(前綴)和rev()erse 順序(后綴)中都只有一個唯一值的連續字符位置的數量
library(dplyr)
library(stringr)
library(purrr)
library(data.table)
library(tidyr)
splitted_strings<-list(
strsplit(VarNamesType2, ''),
rev_char_list = map(strsplit(VarNamesType2, ''), rev)
)
indexes<-splitted_strings %>%
map_int(., \(x) sum(
x %>%
tibble(temp = .) %>%
unnest_wider(temp)%>%
map_int(~length(unique(.x))) %>%
data.table::rleid(.)==1
)) %>%
set_names(c('prefix', 'suffix'))
str_sub(VarNamesType2,
start = indexes['prefix'] 1,
end = -(indexes['suffix'] 1))
[1] "9" "3" "5" "7" "88"
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/383637.html
上一篇:根據條件替換值
下一篇:如何匹配或不匹配多個前綴?
