Вы все еще можете использовать gregexpr
. Но вам нужно будет перебирать результаты gregexpr
и делать совпадения одинаковой длины, заполняя пустые значения NA
. С df
(публикуемыми ниже), вы могли бы сделать
g <- gregexpr("09", df$string, fixed = TRUE)
cbind(df, t(sapply(g, `length<-`, max(sapply(g, length)))))
# key string 1 2
# 1 10 09123022130908123 1 11
# 2 11
# 3 12 12387109387126309 7 16
# 4 13 88888888888888809 16 NA
В случае, если вы делаете это на несколько моделей, вот небольшая функция, которая может помочь
where <- function(data, col, pattern, ...)
{
g <- gregexpr(pattern, data[[col]], ...)
dc <- do.call(rbind, lapply(g, function(x) {
x <- if(any(x < 0)) NA else x
`length<-`(x, max(sapply(g, length)))
}))
colnames(dc) <- letters[1:ncol(dc)]
cbind(df, dc)
}
И несколько спусков образца:
where(df, "string", "8", fixed = TRUE)
# key string a b c d e f g h i j k l m n o
# 1 10 09123022130908123 14 NA NA NA NA NA NA NA NA NA NA NA NA NA NA
# 2 11NA NA NA NA NA NA NA NA NA NA NA NA NA
# 3 12 12387109387126309 4 10 NA NA NA NA NA NA NA NA NA NA NA NA NA
# 4 13 88888888888888809 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
where(df, "string", "09", fixed = TRUE)
# key string a b
# 1 10 09123022130908123 1 11
# 2 11
# 3 12 12387109387126309 7 16
# 4 13 88888888888888809 16 NA
where(df, "string", "12", fixed = TRUE)
# key string a b
# 1 10 09123022130908123 3 15
# 2 11
# 3 12 12387109387126309 1 12
# 4 13 88888888888888809 NA NA
данных:
df <-
structure(list(key = c(10, 11, 12, 13), string = structure(c(2L,
1L, 3L, 4L), .Label = c("", "09123022130908123",
"12387109387126309", "88888888888888809"), class = "factor")), .Names = c("key",
"string"), row.names = c(NA, -4L), class = "data.frame")
Вы, вероятно, хотите, чтобы функция 'unlist' была завершена в какой-либо оператор' apply'. – n8sty