- 已编辑
我现在遇到一个表格,大概10k行,筛选数据时会用到前两列。
每行的数据都是字符串,但却不是对应单一结果,比如:第一列是 AAAABBCCCDDDDD
……第二列是 BCDCDAFFBCDE
……
假设我只需要两种筛选条件B,C
,且已经有了向量 c("B","C")
,那么如何把 前两列中包含 B或C 的所有行挑出?谢谢!
可能我看的例子少,有类似Excel中vlookup函数的解决方案,但是列中的结果都是唯一的,我需要选出的数据,大部分都是多行对应同样的值。
我现在遇到一个表格,大概10k行,筛选数据时会用到前两列。
每行的数据都是字符串,但却不是对应单一结果,比如:第一列是 AAAABBCCCDDDDD
……第二列是 BCDCDAFFBCDE
……
假设我只需要两种筛选条件B,C
,且已经有了向量 c("B","C")
,那么如何把 前两列中包含 B或C 的所有行挑出?谢谢!
可能我看的例子少,有类似Excel中vlookup函数的解决方案,但是列中的结果都是唯一的,我需要选出的数据,大部分都是多行对应同样的值。
用正则表达式。
grepl("B|C", "AABBCC")
## [1] TRUE
grepl("B|C", "BBBBBB")
## [1] TRUE
grepl("B|C", "DDEEFF")
## [1] FALSE
第一个参数是模式,竖杠表示或,你可以先从向量 c("B", "C")
生成模式字符串,然后分别对两列调用正则表达式函数,再取两列的交集。
v1 = c("AABBCC", "BBCCDD", "DDEEFF")
v2 = c("ABCABC", "DEFDEF", "ABCDEF")
ind1 = grepl("B|C", v1)
ind2 = grepl("B|C", v2)
ind = ind1 & ind2
ind1
## [1] TRUE TRUE FALSE
ind2
## [1] TRUE FALSE TRUE
ind
## [1] TRUE FALSE FALSE
在Ihavenothing 的基础上进一步
假如表格为df,第一列为V1,第二列为V2:
library(dplyr)
df = data.table::fread("
V1 V2
AABBCC ABCABC
BBCCDD DEFDEF
DDEEFF DEFDEF
",header = T)
df.filtered = df %>%
filter(grepl("B|C", paste0(V1,V2)))
df.filtered
#> V1 V2
#> 1 AABBCC ABCABC
#> 2 BBCCDD DEFDEF
Created on 2018-12-05 by the reprex package (v0.2.1)
tctcab 建议用 stringr
df %>%
filter(stringr::str_detect(paste0(V1,V2),"B|C"))
可能我没有描述清楚,或是各位的意思理解不到位,总之没有成功。
接着 Ihavenothing 的例子,我的数据是这样的:
| v1 | v2 | col3 | col4 |
|--------|--------|------|------|
| AABBCC | ABCABC | | |
| BBCCDD | DEFDEF | | |
| DDEEFF | ABCDEF | | |
| CCDDFF | DDEEFF | | |
| ABCABC | CCDDFF | | |
| ...... | ...... | | |
若条件是 BBCCDD与DDEEFF,那么对应于 [2,1] [3,1] [4,2],则 [2:4,] 保留,[1,] [5,] 删除不要。
谢谢!
erStern
哦,是完全匹配啊,说清楚嘛
library(dplyr)
df = data.table::fread(
"| v1 | v2 | col3 | col4 |
| AABBCC | ABCABC | | |
| BBCCDD | DEFDEF | | |
| DDEEFF | ABCDEF | | |
| CCDDFF | DDEEFF | | |
| ABCABC | CCDDFF | | |
", header = T
)
df$V1 = 1:nrow(df)
df %>%
filter((v1 %in% c("BBCCDD","DDEEFF")) | (v2 %in% c("BBCCDD","DDEEFF")))
#> V1 v1 v2 col3 col4 V6
#> 1 2 BBCCDD DEFDEF NA NA NA
#> 2 3 DDEEFF ABCDEF NA NA NA
#> 3 4 CCDDFF DDEEFF NA NA NA
<sup>Created on 2018-12-06 by the reprex package (v0.2.1)</sup>
又找到另外的方法,使用 data.table,加上 on= 这一参数即可,初步成功。
详细的操作我再去实验并整理一下。