R 使用gsub替换字符在函数内不起作用

R 使用gsub替换字符在函数内不起作用,r,gsub,R,Gsub,我试图替换R中数据帧中的一些意外字符。根据,gsub函数应该在这种情况下正常工作,所以我尝试了这种方法 数据框第一列中的值如下所示: La Flèche Wallonne Liège - Bastogne - Liège Tour de Romandie Giro d´Italia Critérium du Dauphiné 代码的实现如下所示: callChangeCharacters <- function(results){ for(i in 1:nrow(result

我试图替换R中数据帧中的一些意外字符。根据,gsub函数应该在这种情况下正常工作,所以我尝试了这种方法

数据框第一列中的值如下所示:

La Flèche Wallonne
Liège - Bastogne - Liège
Tour de Romandie
Giro d´Italia
Critérium du Dauphiné
代码的实现如下所示:

callChangeCharacters <- function(results){
for(i in 1:nrow(results)){
    race <- results[i,1]
    race <- gsub("é","e",race)
    race <- gsub("â","a",race)
    race <- gsub("ó","o",race)
    race <- gsub("ž","z",race)
    race <- gsub("ú","u",race)
    race <- gsub("ø","o",race)
    race <- gsub("Å›","s",race)
    race <- gsub("Å‚","l",race)
    race <- gsub("ä‚","a",race)
    race <- gsub("è","e",race)
    race <- gsub("Ã","a",race)
    race <- gsub("Å","s",race)
    race <- gsub("Ä","c",race)
    race <- gsub("´","'",race)
    results[i,1] <- race
}
return(results)
}
但是,如果调用该函数,结果不一样,并且不需要的字符不会被更正:

> correctedDF <- callChangeCharacters(results)
> correctedDF
                                        V1
La Flèche Wallonne
Liège - Bastogne - Liège
Tour de Romandie
Giro d´Italia
Critérium du Dauphiné
知道为什么它在函数内部不起作用吗


提前感谢。

您的代码可以正常工作。此外,您还应更改
ñ
(请参阅“Vuelta Españ”)

gsub
函数是矢量化的,因此根本不需要循环

cleanup <- function(race) {
    race <- gsub("é","e",race)
    race <- gsub("â","a",race)
    race <- gsub("ó","o",race)
    race <- gsub("ž","z",race)
    race <- gsub("ú","u",race)
    race <- gsub("ø","o",race)
    race <- gsub("Å›","s",race)
    race <- gsub("Å‚","l",race)
    race <- gsub("ä‚","a",race)
    race <- gsub("è","e",race)
    race <- gsub("Ã","a",race)
    race <- gsub("Å","s",race)
    race <- gsub("Ä","c",race)
    race <- gsub("´","'",race)
    return(race)
}

results$V1 <- cleanup(results$V1)

我遇到了类似的问题,这是因为我使用
source
函数导入代码,而没有指定
encoding
参数应为
“utf-8”

在检查我读入的函数时,我意识到
函数更改了某些特殊字符,因此该函数无法正常工作。解决方案是将
编码
参数设置为
“utf-8”


抱歉,我不确定答案,但我让您的代码正常工作,假设您的原始数据帧名为“results”,并且是一个字符列。你试过重新启动R吗?我遇到过类似的问题,
grep
函数不起作用。你的函数对我来说很好。你能在你的问题中写出
dput(results)
的输出吗?谢谢@Branden,但得到了相同的结果:它运行for循环有效,但在执行函数时没有更正错误的字符。@DhawalKapil,实际上我得到的输出写在问题中,至少如果我理解您的要求,我希望您编写传递给函数的
结果
对象。您可以使用
dput(结果)
编写它,感谢您的修复。这样看起来快多了。我使用数据帧是因为我有更多的列需要更正,但我也可以使用向量。反正还不行。我将尝试在另一台机器上,如前面的响应中所述。
> dput(results)
structure(list(V1 = c("Santos Tour Down Under", "Paris - Nice", 
"Tirreno-Adriatico", "Milano-Sanremo", "Volta Ciclista a Catalunya", 
"E3 Prijs Vlaanderen - Harelbeke", "Gent - Wevelgem", "Ronde van Vlaanderen / Tour des Flandres", 
"Vuelta Ciclista al Pais Vasco", "Paris - Roubaix", "Amstel Gold Race", 
"La Flèche Wallonne", "Liège - Bastogne - Liège", "Tour de Romandie", 
"Giro d´Italia", "Critérium du Dauphiné", "Tour de Suisse", 
"Tour de France", "Tour de Pologne", NA, "Clasica Ciclista San Sebastian", 
"Eneco Tour", "Vuelta a España", "Vattenfall Cyclassics", "GP Ouest France - Plouay", 
"Grand Prix Cycliste de Québec", "Grand Prix Cycliste de Montréal", 
"Il Lombardia", "Tour of Beijing")), .Names = "V1", row.names = c(1L, 
1686L, 4601L, 6743L, 6943L, 9274L, 9473L, 9673L, 9880L, 11581L, 
11779L, 11978L, 12168L, 12367L, 14264L, 21957L, 24734L, 27727L, 
35542L, 37354L, 37470L, 37627L, 39885L, 47277L, 47441L, 47624L, 
47788L, 47952L, 48147L), class = "data.frame")
cleanup <- function(race) {
    race <- gsub("é","e",race)
    race <- gsub("â","a",race)
    race <- gsub("ó","o",race)
    race <- gsub("ž","z",race)
    race <- gsub("ú","u",race)
    race <- gsub("ø","o",race)
    race <- gsub("Å›","s",race)
    race <- gsub("Å‚","l",race)
    race <- gsub("ä‚","a",race)
    race <- gsub("è","e",race)
    race <- gsub("Ã","a",race)
    race <- gsub("Å","s",race)
    race <- gsub("Ä","c",race)
    race <- gsub("´","'",race)
    return(race)
}

results$V1 <- cleanup(results$V1)
callChangeCharacters <- function(results) {
    results[,1] <- cleanup(results[,1])
    return(results)
}
source("./code.R")
source("./code.R", encoding="utf-8")