具有多个正则表达式的 dplyr 过滤列
dplyr filter columns with multiple regex
我在 R 中有两个 df(元=一些冗余信息)
df1:
id value1 value2 value3 value4
id1_meta_meta-meta 4.93 13.93 16.8 35.39
id2_meta_meta-meta 28.63 45.43 30.52 61.71
id3_meta_meta-meta 3.35 1.26 7.98 4.43
id4_meta_meta-meta 16.78 50.47 32.48 55.52
id5_meta_meta-meta 474.23 807.71 664.45 442.55
id6_meta_meta-meta 26.26 32.83 24.64 41.58
id7_meta_meta-meta 230.1 202.93 166.71 295.48
id8_meta_meta-meta 651.21 1282.71 1012.28 2650.21
df2:
V1
id1
id2
id3
id4
id5
问题
尝试根据 df2 中的 ID 过滤 df1 中的行
代码
library(dplyr)
library(stringr)
df.common = df1 %>%
filter(str_detect(id, '*_') %in% df2$V1)
错误
Error in filter_impl(.data, quo) :
Evaluation error: Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX).
期望的输出
df.common:
id value1 value2 value3 value4
id1_meta_meta-meta 4.93 13.93 16.8 35.39
id2_meta_meta-meta 28.63 45.43 30.52 61.71
id3_meta_meta-meta 3.35 1.26 7.98 4.43
id4_meta_meta-meta 16.78 50.47 32.48 55.52
id5_meta_meta-meta 474.23 807.71 664.45 442.55
在df1
中使用gsub
到trimid
gsub("_.*", "", df1$id)
将删除 _
之后的所有内容
检查 trimmed id
在 df2$V2
中的内容(这将 return 行号)
从 df1
中提取那些行
df1[gsub("_.*", "", df1$id) %in% df2$V2, ]
如果你正在使用dplyr
和stringr
,你也可以考虑这种方式。 str_replace_all
就像 gsub
。 semi_join
是一种 "filter-join",允许您保留仅在 df2
中找到匹配项的记录。
library(dplyr)
library(stringr)
df3 <- df1 %>%
mutate(id2 = str_replace_all(id, "_.*", "")) %>%
semi_join(df2, by = c("id2" = "V1")) %>%
select(-id2)
df3
id value1 value2 value3 value4
1 id1_meta_meta-meta 4.93 13.93 16.80 35.39
2 id2_meta_meta-meta 28.63 45.43 30.52 61.71
3 id3_meta_meta-meta 3.35 1.26 7.98 4.43
4 id4_meta_meta-meta 16.78 50.47 32.48 55.52
5 id5_meta_meta-meta 474.23 807.71 664.45 442.55
我在 R 中有两个 df(元=一些冗余信息)
df1:
id value1 value2 value3 value4
id1_meta_meta-meta 4.93 13.93 16.8 35.39
id2_meta_meta-meta 28.63 45.43 30.52 61.71
id3_meta_meta-meta 3.35 1.26 7.98 4.43
id4_meta_meta-meta 16.78 50.47 32.48 55.52
id5_meta_meta-meta 474.23 807.71 664.45 442.55
id6_meta_meta-meta 26.26 32.83 24.64 41.58
id7_meta_meta-meta 230.1 202.93 166.71 295.48
id8_meta_meta-meta 651.21 1282.71 1012.28 2650.21
df2:
V1
id1
id2
id3
id4
id5
问题
尝试根据 df2 中的 ID 过滤 df1 中的行
代码
library(dplyr)
library(stringr)
df.common = df1 %>%
filter(str_detect(id, '*_') %in% df2$V1)
错误
Error in filter_impl(.data, quo) :
Evaluation error: Syntax error in regexp pattern. (U_REGEX_RULE_SYNTAX).
期望的输出
df.common:
id value1 value2 value3 value4
id1_meta_meta-meta 4.93 13.93 16.8 35.39
id2_meta_meta-meta 28.63 45.43 30.52 61.71
id3_meta_meta-meta 3.35 1.26 7.98 4.43
id4_meta_meta-meta 16.78 50.47 32.48 55.52
id5_meta_meta-meta 474.23 807.71 664.45 442.55
在
中使用df1
gsub
到trimid
gsub("_.*", "", df1$id)
将删除_
之后的所有内容
检查 trimmed
id
在df2$V2
中的内容(这将 return 行号)从
中提取那些行df1
df1[gsub("_.*", "", df1$id) %in% df2$V2, ]
如果你正在使用dplyr
和stringr
,你也可以考虑这种方式。 str_replace_all
就像 gsub
。 semi_join
是一种 "filter-join",允许您保留仅在 df2
中找到匹配项的记录。
library(dplyr)
library(stringr)
df3 <- df1 %>%
mutate(id2 = str_replace_all(id, "_.*", "")) %>%
semi_join(df2, by = c("id2" = "V1")) %>%
select(-id2)
df3
id value1 value2 value3 value4
1 id1_meta_meta-meta 4.93 13.93 16.80 35.39
2 id2_meta_meta-meta 28.63 45.43 30.52 61.71
3 id3_meta_meta-meta 3.35 1.26 7.98 4.43
4 id4_meta_meta-meta 16.78 50.47 32.48 55.52
5 id5_meta_meta-meta 474.23 807.71 664.45 442.55