2017-09-14 44 views
0

我在嘗試將向量中的字符串向量拆分爲向量向量的過程中遇到問題。如果有人可以幫助我,請我卡住了。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)。 現在我的問題就是如何讓那些載體。任何建議是值得歡迎的。

回答

1

使用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 
+0

非常感謝,確實有效!我不熟悉您使用的所有軟件包,但我絕對會加快速度! –

3

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) 

你可以訪問列表el這樣對此語句:

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] 
+0

感謝您的意見。我曾想過這是我的問題,然後訪問最終結果。如從c(FALSE,TRUE,FALSE)開始處理並處理缺失值。 –

0

R沒有矢量向量。

要模擬此行爲,您通常會使用list s和apply-家族。


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 
0

你可以看看*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 
+0

謝謝。我試着廣泛應用,但最終如果失敗了。我基本上想避免這個列表元素。 –

0

strsplit可以幫你做,如果你將它與'lapply'結合起來。

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之間,則驗證向量中有一些元素。

+0

出色的工作!謝謝! –

相關問題