2017-09-14 106 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

出色的工作!谢谢! –

相关问题