• R语言
  • R中如何把符合某项的多行挑出来?

我现在遇到一个表格,大概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)

      可能我没有描述清楚,或是各位的意思理解不到位,总之没有成功。
      接着 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= 这一参数即可,初步成功。
        详细的操作我再去实验并整理一下。