我在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)。 现在我的问题是得到那些向量。欢迎提出任何建议。
答案 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)
您可以访问以下列表元素:
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]
答案 1 :(得分: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
答案 2 :(得分:0)
R没有矢量矢量。
要模仿此行为,您通常会使用list
和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
答案 3 :(得分:0)
您可以查看*apply
系列函数。例如,使用sapply
将strsplit
函数应用于您获得的每个列表元素
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
答案 4 :(得分:0)
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之间,则验证向量中会包含一些元素。