在大型数据集中查找包含子字符串“en”的所有匹配项的(行,列)位置。
数据集有100多个cols& 1百万行
原本不知道是否存在
示例数据集:
#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"
或任何可矢量化的表达。
which(df == "en",arr.ind = T)
找不到子字符串匹配,但不适用于字符。grep("en",df[1:ncol(df)])
无法返回ROW索引for (i in 1:ncol(df)){print(grep("en",df[i]))}
COL的索引无法显示,无法在同一列中返回第二个ENCOUNTER的索引。答案 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"
))