Скажем, у меня есть столбец df1$z
с некоторыми "грязными" строками в
> df1$z
[1] alpha uybkh kilo-mdjfyrs lima qxaucnpe gamma-qpnej
[5] beta-okmwy beta-uybkh gamma mdjfyrs lima qxaucnpe
[9] beta qpnej kilo okmwy
9 Levels: alpha uybkh beta-okmwy beta-uybkh ... lima qxaucnpe
Некоторые строки начинаются с шаблонов, включенных в другой вектор a
.
> a
[1] "alpha" "beta" "gamma"
Эти a
строки соответствия в z
Я хочу заменить на соответствующий шаблон вектора a
, чтобы получились следующие результаты:
# [1] "alpha" "kilo-mdjfyrs" "lima qxaucnpe" "gamma"
# [5] "beta" "beta" "gamma" "lima qxaucnpe"
# [9] "beta" "kilo okmwy"
Я написал функцию, которая приблизила меня, но он заменяет строки не сразу, и мне не удалось собрать все воедино:
> lapply(seq_along(a), function(x) {z[grep(paste0("^", a[x]), z)] <- a[x]; z})
[[1]]
[1] "beta sfrmyijl" "lima-xudwfkm" "lima-kirvpys" "gamma wriygcb"
[5] "alpha" "alpha" "kilo xudwfkm" "alpha"
[9] "gamma wriygcb" "kilo-wvxgar"
[[2]]
[1] "beta" "lima-xudwfkm" "lima-kirvpys" "gamma wriygcb"
[5] "alpha wvxgar" "alpha-sfrmyijl" "kilo xudwfkm" "alpha-kirvpys"
[9] "gamma wriygcb" "kilo-wvxgar"
[[3]]
[1] "beta sfrmyijl" "lima-xudwfkm" "lima-kirvpys" "gamma"
[5] "alpha wvxgar" "alpha-sfrmyijl" "kilo xudwfkm" "alpha-kirvpys"
[9] "gamma" "kilo-wvxgar"
Я также потерпел неудачу с некоторыми mapply()
подходами, которые, как мне кажется, могли бы быть здесь полезными, и рассмотрелнекоторые существующие ответы, такие как этот , который я не смог приспособить к своей конкретной проблеме.
Так как бы я сделал это эффективным базовым R способом? Обратите внимание , что замена должна быть помещена обратно во фрейм данных df1
, не нарушая порядок строк.
Данные
a <- c("alpha", "beta", "gamma")
set.seed(105056)
z <- paste0(sample(c(a, "kilo", "lima"), 10, replace=TRUE),
sample(c("-", " "), 10, replace=TRUE),
replicate(5, paste0(sample(letters, sample(5:9)), collapse="")))
df1 <- data.frame(z, x=rnorm(10))