簡體   English   中英

R在向量中以不同長度分割字符串

[英]R split strings in vector with different lengths

我在R中嘗試將字符串的向量拆分為向量的向量時遇到問題。 如果有人可以幫助我,請堅持。

我有:

V <- c("AAAAA", "AAAAA BBBBB", "CCCCC DDDDD")

使用strsplit我得到:

s <- strplit(v)
s
[[1]]
[1] "AAAAA"

[[2]]
[1] "AAAAA" "BBBBB"

[[3]]
[1] "CCCCC" "DDDDD" 

但是,我無法訪問它們以進行比較。 我想要類似的東西:

 s
[1] "AAAAA"
[2] "AAAAA" "BBBBB"
[3] "CCCCC" "DDDDD" 

然后,我想看看這些向量中的每個向量的元素是否包含在我的驗證向量中(例如c(“ AAAAA”,“ BBBBB,” CCCCC“),並在最后返回一個布爾值(如果所有元素都在其中,則為TRUE,否則為FALSE),目前我的問題是獲取這些向量,歡迎提出任何建議。

strsplit返回一個列表,您可以通過對自定義函數使用lapply來瀏覽列表

V <- c("AAAAA", "AAAAA BBBBB", "CCCCC DDDDD")
s <- strsplit(V, split = " ")
val <- c("AAAAA", "BBBBB", "CCCCC")

lapply(s, function(x) x %in% val)

您可以像這樣訪問列表元素:

s[[1]]
s[[2]]

檢查是否所有元素都存在於val中

all <- lapply(s, function(x) sum(x %in% val) == length(val))
#output 
[[1]]
[1] FALSE

[[2]]
[1] FALSE

[[3]]
[1] FALSE

將此列表轉換為向量

all <- unlist(all)

從V返回原始元素

v[all]

使用tidyverse ,您可以選擇

V <- c("AAAAA", "AAAAA BBBBB", "CCCCC DDDDD")
validation <- c("AAAAA", "BBBBB", "CCCCC")

library(purrr)
library(stringr)
str_split(V, pattern = " ") %>% 
  map_lgl(~all(.x %in% validation))
#> [1]  TRUE  TRUE FALSE

您還可以將其包含在dplyr以獲取有關已驗證或不驗證哪個向量的清晰摘要。

library(dplyr, warn.conflicts=F)
data_frame(V) %>%
  mutate(validate = str_split(V, pattern = " ") %>% 
           map_lgl(~all(.x %in% validation)))
#> # A tibble: 3 x 2
#>             V validate
#>         <chr>    <lgl>
#> 1       AAAAA     TRUE
#> 2 AAAAA BBBBB     TRUE
#> 3 CCCCC DDDDD    FALSE

R沒有向量的向量。

為了模擬這種行為,您通常會使用listapply -family。


input_vector <- c("AAAAA", "AAAAA BBBBB", "CCCCC DDDDD")

# split the string like you did
s <- strsplit(input_vector, split = " ")
s
#> [[1]]
#> [1] "AAAAA"
#> 
#> [[2]]
#> [1] "AAAAA" "BBBBB"
#> 
#> [[3]]
#> [1] "CCCCC" "DDDDD"

# create a vector with conditions that wee look for
validation_vector <- c("AAAAA", "BBBBB")

# create a matrix of matches
res_matrix <- sapply(s, function(s_part) {
  validation_vector %in% s_part
})

# check if all validation_vector elements are true for a given input_vector-string
# by applying the 'all'-function over each column ("are all elements for a given column TRUE?")
res_vector <- apply(res_matrix, 2, all)
# for aesthetic purposes: add the name of the initial input_vector again
names(res_vector) <- input_vector

# display the result
res_vector
#>       AAAAA AAAAA BBBBB CCCCC DDDDD 
#>       FALSE        TRUE       FALSE

您可以看一下*apply函數系列。 例如,使用sapplystrsplit函數應用於您獲得的每個列表元素

vs <- sapply(V, strsplit, split = " ")

vs

$AAAAA
[1] "AAAAA"

$`AAAAA BBBBB`
[1] "AAAAA" "BBBBB"

$`CCCCC DDDDD`
[1] "CCCCC" "DDDDD"

進一步檢查您的validation向量,您可以執行

validation <- c("AAAAA", "BBBBB", "CCCCC")
vs_in_val <- sapply(vs, `%in%`, validation) 

vs_in_val

$AAAAA
[1] TRUE

$`AAAAA BBBBB`
[1] TRUE TRUE

$`CCCCC DDDDD`
[1]  TRUE FALSE

如果將其與“ lapply”結合使用,strsplit可以幫助您完成此任務。

V <- c("AAAAA", "AAAAA BBBBB", "CCCCC DDDDD")
s <- strsplit(V," ")
sapply(s,function(x) return (sum(x %in% c("AAAAA", "BBBBB", "CCCCC"))/length(x)))
[1] 1.0 1.0 0.5

如果結果返回0,則表明您的驗證向量中沒有元素。

如果為1,則驗證向量中的所有元素。

如果介於0和1之間,則驗證向量中包含某些元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM