假设我有一个字符向量(向量(A)),该向量在其每个元素中都包含一个字符串(因此,单独的字符串:A1,A2,A3等)。我想将每个字符串与另一个字符串向量(向量(B))进行比较,以查看是否存在匹配项。
例如,这意味着当向量Axyz
在其第一个元素中具有字符串,而向量Bxyz_blah
在任何元素中均具有字符串时,我将TRUE
在测试A-1是否存在于B中(无论如何)时得到。
vec_a <- c()
vec_b <- c()
vec_a[1] <- "xyz"
set.seed(2020) ; vec_b[sample(1:100, size = 1)] <- "xyz_blah"
grepl(vec_a, vec_b)
## [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [27] FALSE TRUE
但是我的情况恰好更复杂。首先,向量A中有多个字符串,我想测试向量B中是否存在。
vec_a[1] <- "xyz"
vec_a[2] <- "vvtp"
set.seed(2020)
vec_b[sample(1:100, size = 1)] <- "xyz_blah"
vec_b[sample(1:100, size = 1)] <- "vvtp_blah"
而不是2 TRUE
s,而是grepl(vec_a, vec_b)
返回allFALSE
和错误:
警告消息:在grepl(vec_a,vec_b)中:参数'pattern'的长度> 1,并且仅使用第一个元素
其次,有时我知道向量A中的字符串在向量B中出现时可能带有不同的加法(或“版本”)。例如,向量A可能包含dog_height
和/或dog_weight
,向量B也可能包含。所以我想指定不仅是“ stem”字符串,还包括潜在的版本,并测试每个字符串是否都出现在向量B中。当我的数据可以具有一个dog_weight
或一个weight_dog
(但不能同时具有两个)时,情况变得更加复杂,因此我知道dog
并且weight
必须同时存在于向量B中只有一个字符串,但不是确切的模式。
我有宠物诊所的数据。
_
或~
或-
)library(tibble)
df <- tribble(~dog_weight, ~dog_height, ~cat_weight, ~cat_height, ~hamster, ~`rabbit~weight`, ~parrot_height, ~`weight-guinea_pig`)
因此:
names(df)
[1] "dog_weight" "dog_height" "cat_weight" "cat_height" "hamster" "rabbit~weight" "parrot_height" "weight-guinea_pig"
现在,假设我要查询数据并查看是否具有:
一种方法是指定一个带有动物名称和度量类型的函数,以使被调用的函数locate_in_df()
具有三个参数:
vector_of_animals
有c(dog, guinea_pig, hamster)
; 和type_of_measure
可以是 c(height, weight, any)
animals <- c("dog", "guinea_pig", "hamster")
measures <- c("weight", "height")
locate_in_df(vector_of_animals = animals,
type_of_measure = measures,
dataframe = df)
并将返回:
animal weight height any
<chr> <lgl> <lgl> <lgl>
1 dog TRUE TRUE TRUE
2 guinea_pig TRUE FALSE TRUE
3 hamster FALSE FALSE TRUE
另一种方法可以指定动物的媒介和度量类型,并对其进行测试,names(df)
以便:
vec_of_query <- c("dog, height", "dog, weight", "guinea_pig, weight", "hamster")
然后grepl()
要返回某种类似的东西TRUE TRUE TRUE TRUE
?它比第一种方法的粒度要小,但仍能提供有用的信息,它可以追溯到本篇文章的开始,讨论向量之间的匹配字符串。问题是,我不知道该如何解决这两个想法。知道如何实现吗?
您可以这样实现locate_in_df
:
locate_in_df <- function(vector_of_animals, type_of_measure, dataframe) {
haystack <- names(dataframe)
vs <- apply(sapply(type_of_measure, function(x) {
lapply(vector_of_animals, function(y) {
any(grepl(x, haystack) & grepl(y, haystack))
})
}), 2, unlist)
tibble(animals = vector_of_animals,
as.data.frame(vs),
any = sapply(vector_of_animals, function(x) any(grepl(x, haystack))))
}
这样的
locate_in_df(vector_of_animals = animals,
type_of_measure = measures,
dataframe = df)
#> # A tibble: 3 x 4
#> animals weight height any
#> <chr> <lgl> <lgl> <lgl>
#> 1 dog TRUE TRUE TRUE
#> 2 guinea_pig TRUE FALSE TRUE
#> 3 hamster FALSE FALSE TRUE
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句