我在R中有两个df(meta =一些冗余信息)
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
答案 0 :(得分:4)
如果您使用dplyr
和stringr
,也可以考虑这种方法。 str_replace_all
与gsub
类似。 semi_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
答案 1 :(得分:2)
使用gsub
修剪id
df1
gsub("_.*", "", df1$id)
将删除_
检查id
中df2$V2
被修剪的内容(这将返回行号)
从df1
df1[gsub("_.*", "", df1$id) %in% df2$V2, ]