查找所有匹配项的(行,列)位置到大型数据集

时间:2018-02-10 08:14:32

标签: r dataframe string-matching

在大型数据集中查找包含子字符串“en”的所有匹配项的(行,列)位置。

  1. 数据集有100多个cols& 1百万行

  2. 原本不知道是否存在

  3. 示例数据集:

    #Dataset call df
           col_1 col_2 col_3
        1    101  10n1 cb101
        2 ed10en    dn   101
        3    101   NA  1e01
        4    101 r1en1   ""
        5   en10   101 en5en
    

    结果如:第一场比赛是(2,1),第二场比赛是(5,1),第三场比赛是(4,2),第四场比赛是(5,3)是预期解决方案可以提供的。< / p>

    >"2,1","5,1","4,2","5,3"
    

    或任何可矢量化的表达。

    1. which(df == "en",arr.ind = T)找不到子字符串匹配,但不适用于字符。
    2. grep("en",df[1:ncol(df)])无法返回ROW索引
    3. for (i in 1:ncol(df)){print(grep("en",df[i]))} COL的索引无法显示,无法在同一列中返回第二个ENCOUNTER的索引。
    4. Excel中的功能: Ctrl + F - 查找&gt; “全部查找”更像是 预期的解决方案。

2 个答案:

答案 0 :(得分:1)


reprex::reprex_info()
#> Created by the reprex package v0.1.1.9000 on 2018-02-10

您可以使用grepl加上一些技巧来将结果作为行 和列索引,而不是从grep得到的向量索引。

df <- read.table(
header = T, text = '
     col_1 col_2 col_3
       101  10n1 cb101
    ed10en    dn   101
       101    NA  1e01
       101 r1en1    ""
      en10   101 en5en')

x <- as.matrix(df)
i <- grepl("en", x)    # logical vector of length = nrow(x) * ncol(x)
i
#>  [1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE
#> [12] FALSE FALSE FALSE  TRUE

dim(i) <- dim(x)       # coerce to matrix with same dimensions as x
i
#>       [,1]  [,2]  [,3]
#> [1,] FALSE FALSE FALSE
#> [2,]  TRUE FALSE FALSE
#> [3,] FALSE FALSE FALSE
#> [4,] FALSE  TRUE FALSE
#> [5,]  TRUE FALSE  TRUE

which(i, arr.ind = T)  # check which are TRUE and report as row, col
#>      row col
#> [1,]   2   1
#> [2,]   5   1
#> [3,]   4   2
#> [4,]   5   3

另一种方法可能是使用grep,结合一些模块化 算术来计算出行和列的位置,给出了 数据的维度,并使用R中的矩阵基本上是这样的 包含行数的列向量:

i <- grep("en", x)
i
#> [1]  2  5  9 15

row <- 1 + (i - 1) %% nrow(x)   # number of positions outside full columns
col <- 1 + (i - 1) %/% nrow(x)  # number of full columns before position i

cbind(row, col)
#>      row col
#> [1,]   2   1
#> [2,]   5   1
#> [3,]   4   2
#> [4,]   5   3

对于大数据,感觉后一种方法会更有效,因为您可以避免创建大型中间逻辑向量。

答案 1 :(得分:0)

希望这有帮助!

l <- lapply(colnames(df), function(x) grep("en", df[,x]))
final_result <- unlist(lapply(seq_along(l), function(i) paste(l[[i]], i, sep = ",")))
final_result

输出是:

[1] "2,1" "5,1" "4,2" "5,3"

示例数据:

df <- structure(list(col_1 = c("101", "ed10en", "101", "101", "en10"
), col_2 = c("10n1", "dn", NA, "r1en1", "101"), col_3 = c("cb101", 
"101", "1e01", "", "en5en")), .Names = c("col_1", "col_2", "col_3"
), class = "data.frame", row.names = c("1", "2", "3", "4", "5"
))