它在循环中工作,但当for循环在函数中时就不行了,为什么



我想创建一个函数,当一个向量与另一个向量匹配时,更改它的名称。当我把它写成for循环时,它是有效的,但我想把它放在函数中,然后它就不起作用了,我做错了什么?谢谢

在for循环中:

df <- 1:5
df2 <- data.frame(id=3:7, name=LETTERS[1:5]) 
for(i in 1:length(df)) {
for(j in 1:nrow(df2)){
if(df[i]==df2$id[j]){
df[i] <- df2$name[j]
}
}
}
df
#> [1] "1" "2" "A" "B" "C"

我想把它放在一个函数中,它不起作用:

match <- function(df,df2){
for(i in 1:length(df)) {
for(j in 1:nrow(df2)){
if(df[i]==df2$id[j]){
df[i] <- df2$name[j]
}
}
}
}
df <- match(df,df2)
df
#> NULL

您忘记返回函数内部的df。

match <- function(df,df2){
for(i in 1:length(df)) {
for(j in 1:nrow(df2)){
if(df[i]==df2$id[j]){
df[i] <- df2$name[j]
}
}
}
df
}
df <- 1:5
df2 <-data.frame(id=3:7, name=LETTERS[1:5]) 
df <- match(df, df2)
df
#> [1] "1" "2" "A" "B" "C"

创建于2021-11-18由reprex包(v2.0.1(

由于R是一种矢量化语言,因此这里不需要循环。在match:中使用内置程序怎么样

tmp <- df2$name[match(df, df2$id)]
df <- ifelse(is.na(tmp), df, tmp)
df
# [1] "1" "2" "A" "B" "C"

这当然可以用函数来包装。

作为一种替代方案;加入";函数,例如包dplyr中的left_join

最新更新