我想创建一个函数,当一个向量与另一个向量匹配时,更改它的名称。当我把它写成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
。