r 函数有条件地匹配部分字符串
r function to conditionally match parcial strings
我有两个大数据集,我想对一些列进行子集化以便使用这些数据。
我的问题是用于子集化的参考列不完全匹配。所以我希望能够匹配相同的字符串部分。
这里有一个更简单的例子:
ref_df <- data.frame("reference" = c("swietenia macrophylla",
"azadirachta indica",
"cedrela odorata",
"ochroma pyramidale",
"tectona grandis",
"tamarindus indica",
"cariniana pyriformis",
"paquita quinata",
"albizia saman",
"enterolobium cyclocarpum",
"tapirira guianensis",
"dipteryx oleifera"),
"values" = c(rnorm(12)))
tofind_df <- c("swietenia macrophylla and try try",
"azadirachta indica",
"tamarindus indica (bla bla)",
"tara",
"bla bla (paquita quinata)",
"prosopis pallida",
"dipteryx oleifera")
所以我尝试保留 ref_df 的所有值,这些值的名称甚至与 tofond_df 中的部分匹配,但只有在它们相同时才会匹配。
finale <- ref_df[ref_df$reference %in% tofind_df$names,]
我也用 grepl 试过,但找不到解决方案。
我理想的结局应该是这样的:
reference values
1 swietenia macrophylla -0.459001383
2 azadirachta indica -0.430014486
3 tamarindus indica -0.541887328
4 paquita quinata -0.003572792
5 dipteryx oleifera -0.855659901
请考虑两个大 df 而不是这种更简单的情况。
我们需要使用 sapply
从 grepl
中获取每个元素的结果
ref_df[sapply(ref_df$reference, function(x) any(grepl(x, tofind_df))),]
reference values
1 swietenia macrophylla 1.4482830
2 azadirachta indica 0.9037943
6 tamarindus indica -0.2994678
8 paquita quinata 0.4895183
12 dipteryx oleifera -1.1652528
您可以使用 group_by 并从 dplyr 过滤和从 stringr 过滤 str_detect:
library(dplyr)
library(stringr)
ref_df %>%
mutate(reference = as.character(reference))%>% #reference is factor. Making it a character
group_by(reference) %>%
filter(any(str_detect(tofind_df,reference)))%>% #Finding if there are any matches between each reference name and any of the strings in the tofind_df
ungroup()
# A tibble: 5 x 2
reference values
<chr> <dbl>
1 swietenia macrophylla -0.456
2 azadirachta indica -1.08
3 tamarindus indica -0.428
4 paquita quinata -0.937
5 dipteryx oleifera 0.816
我有两个大数据集,我想对一些列进行子集化以便使用这些数据。 我的问题是用于子集化的参考列不完全匹配。所以我希望能够匹配相同的字符串部分。
这里有一个更简单的例子:
ref_df <- data.frame("reference" = c("swietenia macrophylla",
"azadirachta indica",
"cedrela odorata",
"ochroma pyramidale",
"tectona grandis",
"tamarindus indica",
"cariniana pyriformis",
"paquita quinata",
"albizia saman",
"enterolobium cyclocarpum",
"tapirira guianensis",
"dipteryx oleifera"),
"values" = c(rnorm(12)))
tofind_df <- c("swietenia macrophylla and try try",
"azadirachta indica",
"tamarindus indica (bla bla)",
"tara",
"bla bla (paquita quinata)",
"prosopis pallida",
"dipteryx oleifera")
所以我尝试保留 ref_df 的所有值,这些值的名称甚至与 tofond_df 中的部分匹配,但只有在它们相同时才会匹配。
finale <- ref_df[ref_df$reference %in% tofind_df$names,]
我也用 grepl 试过,但找不到解决方案。
我理想的结局应该是这样的:
reference values
1 swietenia macrophylla -0.459001383
2 azadirachta indica -0.430014486
3 tamarindus indica -0.541887328
4 paquita quinata -0.003572792
5 dipteryx oleifera -0.855659901
请考虑两个大 df 而不是这种更简单的情况。
我们需要使用 sapply
从 grepl
中获取每个元素的结果
ref_df[sapply(ref_df$reference, function(x) any(grepl(x, tofind_df))),]
reference values
1 swietenia macrophylla 1.4482830
2 azadirachta indica 0.9037943
6 tamarindus indica -0.2994678
8 paquita quinata 0.4895183
12 dipteryx oleifera -1.1652528
您可以使用 group_by 并从 dplyr 过滤和从 stringr 过滤 str_detect:
library(dplyr)
library(stringr)
ref_df %>%
mutate(reference = as.character(reference))%>% #reference is factor. Making it a character
group_by(reference) %>%
filter(any(str_detect(tofind_df,reference)))%>% #Finding if there are any matches between each reference name and any of the strings in the tofind_df
ungroup()
# A tibble: 5 x 2
reference values
<chr> <dbl>
1 swietenia macrophylla -0.456
2 azadirachta indica -1.08
3 tamarindus indica -0.428
4 paquita quinata -0.937
5 dipteryx oleifera 0.816