【发布时间】:2019-07-22 10:51:29
【问题描述】:
我有两个数据框(df1 和 df2),我想用 df2 中的相应字符串替换 df1 中的部分字符串。
例如:结果应该是df3
a <- c("extra text test-ID 1", "extra text test-ID 2", "extra text test-ID 3", "extra text test-ID 4")
b <- c("experiment 5","experiment 6","experiment 7","experiment 8")
c <- c("exercise 9","exercise 10","exercise 11","exercise 12")
df1 <- data.frame(a,b,c)
names(df1) <- c('a','b','c')
d <- c("test-ID 1", "test-ID 2", "test-ID 4")
e <- c("test-ID 1098", "test-ID 245", "test-ID 77")
df2 <- data.frame(d,e)
names(df2) <- c('a','b')
df1
df2
f <- c("extra text test-ID 1098", "extra text test-ID 245", "extra text test-ID 3", "extra text test-ID 77")
g <- c("experiment 5","experiment 6","experiment 7","experiment 8")
h <- c("exercise 9","exercise 10","exercise 11","exercise 12")
df3 <- data.frame(f,g,h)
names(df3) <- c('a','b','c')
df3
我想用一个函数来执行这个。
replacefunction <- function(x) {
cat(paste("searching for ", x, "\n"))
for (i in seq_along(df2$a)) {
old <- df2$a[i]
new <- df2$b[i]
if (grepl(old, x)) {
cat(paste0('found ', '"', old, '"', "\n"))
return(gsub(old, new, x))
}
}
}
但是,这会发出警告:
df4 <- replace_values(df1$a)
Warning message:
In if (grepl(old, x)) { :
the condition has length > 1 and only the first element will be used
只有 df1$a 列中的第一个条目被更改,为什么会发生这种情况?
【问题讨论】:
-
我并不完全遵循您希望如何从一个数据帧到下一个数据帧的逻辑。但是,当您在具有多个元素的向量上使用
if ... else语句时,就会出现该警告。这错过了 R 的优点之一,即vectorized operations。像grepl这样的函数将作用于整个向量——不需要循环一次遍历一个元素 -
@camille
grepl本身在这里并没有多大帮助,因为有多个替换以及多个要匹配的模式。 -
确实如此。就像我说的,我没有得到从一个字符串到下一个字符串的所有逻辑。但是
grepl是引发此警告的原因,所以这似乎是使用if ... else的一个实例,它不能代替像ifelse这样的矢量化函数。除非目的是查找字符串是否在 any 元素中,在这种情况下ifelse(any(grepl(...))可能是它? -
感谢您的快速回复。是的,目的是在任何元素中查找字符串,但是
ifelse(any(grepl(...))会产生相同的错误
标签: r string loops replace gsub