【发布时间】:2018-12-23 05:31:20
【问题描述】:
我有一个非常简单的问题,但我不知道如何得到想要的结果。
我有一个包含多个列的 data.frame,我想在其中的四个列中 grep 一个值以获取 data.frame 的子集。
这是一个虚拟示例
>df1
V1 V2 V3 V4 V5
a abc|ccc|ggg ttt|ccc|shg yyy|lmn|trs abc|ggt|hgy
b atc|cjc|ggg ttt|ccc|shg abc|lmn|trs abc|opq|sss
c auc|chc|ggg abc|ccc|shg gtc|lmn|trs hyt|lki|ddd
d aoc|cfc|ggg ttt|ccc|shg yyy|lmn|trs rmn|wde|tre
我想根据 abc 模式为列 V2,V3,V4,V5 子集 data.frame
我知道对于一栏我可以做到
df2 <- df[grep('abc`, df$V1),]
但是如何使用多列得到这个结果呢?
>df2
V1 V2 V3 V4 V5
a abc|ccc|ggg ttt|ccc|shg yyy|lmn|trs abc|ggt|hgy
b atc|cjc|ggg ttt|ccc|shg abc|lmn|trs abc|opq|sss
c auc|chc|ggg abc|ccc|shg gtc|lmn|trs hyt|lki|ddd
我不想在这个问题 grep one pattern over multiple columns 中获得额外的列,我想根据模式对 data.frame 进行子集化
谢谢
【问题讨论】:
-
@RonakShah,抱歉,复制和粘贴出错
-
试试
df1 %>% filter_at(vars(V2:V5), any_vars(grepl("abc", .))) -
@StevenBeaupré,这种方法比发布的解决方案运行得更快。我还考虑首先对我的 data.frame 进行子集化,获取与我的 data.frame 子集上的模式匹配的行索引,然后使用该索引对大 data.frame 进行子集化。虽然我不知道这样会不会更快
-
如果您真的关心速度,那么尽可能摆脱 grep 可能是有意义的。您是否总是在搜索整个术语?或者您正在搜索部分术语?例如,您是一直在搜索“abc”还是有时只搜索“ab”?此外,您是否收到“abc|ccc|ggg”格式的数据,或者您是否正在执行将其置于该格式的过程?如果您以这种方式获取数据是有意义的,但如果您以不同的格式获取数据,可能会有更快的处理方式。
-
@AdamSampson,我的格式总是这样,还有另外 100 列,但我对 grep 管道中包含的模式感兴趣,有时是第一个术语,但有时不是,我当然想如果我能摆脱 grep,加快这个过程。任何帮助将不胜感激,我的 data.frame 看起来像这样 dropbox.com/s/jfmv6npiiu8n6zv/big_df.txt?dl=0>
标签: r