R sapply环路将替换为for环路

R sapply环路将替换为for环路,r,for-loop,sapply,R,For Loop,Sapply,我以前成功地将for loops切换到sapply loops, 我知道一个事实(system.time())就是它们更快 但我的思维仍然以一种循环的方式运作 请帮助我将此转换为循环情况: names.list <- c("Anna", "Ana", "Albert", "Albort", "Rob", "Robb", "Tommy", "Tommie") misspell.list <- c("Anna", "Albort", "Robb", "Tommie") fix.list

我以前成功地将for loops切换到sapply loops, 我知道一个事实(system.time())就是它们更快

但我的思维仍然以一种循环的方式运作

请帮助我将此转换为循环情况:

names.list <- c("Anna", "Ana", "Albert", "Albort", "Rob", "Robb", "Tommy", "Tommie")
misspell.list <- c("Anna", "Albort", "Robb", "Tommie")
fix.list <- c("Ana", "Albert", "Rob", "Tommy")

for(i in 1:length(fix.list)) {
        names.list[which(names.list == misspell.list[i])] <- fix.list[i]

}

names.list
编辑2:多亏了你,现在我是一个多才多艺的霸主,我来这里只是为了展示我的另一个与adist()一起使用的多才多艺的替代品


nomes如果拼写错误的
list
fix.list
之间存在一对一的对应关系,您可以使用
match
函数消除循环

names.list[match(misspell.list,names.list)] <- fix.list

names.list
#[1] "Ana"    "Ana"    "Albert" "Albert" "Rob"    "Rob"    "Tommy"  "Tommy"

names.list[match(misspell.list,names.list)]如果
misspell.list
fix.list
之间存在一对一的对应关系,则可以使用
match
函数消除循环

names.list[match(misspell.list,names.list)] <- fix.list

names.list
#[1] "Ana"    "Ana"    "Albert" "Albert" "Rob"    "Rob"    "Tommy"  "Tommy"

names.list[match(misspell.list,names.list)]使用
match
的解决方案要好得多,但就您尝试执行的操作而言,这是可行的。首先,你不需要
这个
。您还需要使用
使用
match
的解决方案要好得多,但就您试图做的事情而言,这将起作用。首先,你不需要
这个
。您还需要使用
我建议对您的整个设置进行一个小的更改。当像您这样使用索引时,您需要确保顺序始终相同。如果你添加或删除一个名字,整个事情就会分崩离析

使用命名列表和
lappy
sapply
,您的代码将保持动态,并且您可能会将多个拼写错误与一个名称相匹配

misspell.list  <-  list(
  'Anna' = 'Ana',
  'Albort' = 'Albert',
  'Robb' = 'Rob',
  'Tommie' = 'Tommy'
)

names.list <- c("Anna", "Ana", "Albert", "Albort", "Rob", "Robb", "Tommy", "Tommie")


> sapply(names.list,function(x) ifelse(x %in% names(misspell.list),misspell.list[[x]],x))
    Anna      Ana   Albert   Albort      Rob     Robb    Tommy   Tommie 
   "Ana"    "Ana" "Albert" "Albert"    "Rob"    "Rob"  "Tommy"  "Tommy" 

我建议对您的整个设置进行一个小小的更改。当像您这样使用索引时,您需要确保顺序始终相同。如果你添加或删除一个名字,整个事情就会分崩离析

使用命名列表和
lappy
sapply
,您的代码将保持动态,并且您可能会将多个拼写错误与一个名称相匹配

misspell.list  <-  list(
  'Anna' = 'Ana',
  'Albort' = 'Albert',
  'Robb' = 'Rob',
  'Tommie' = 'Tommy'
)

names.list <- c("Anna", "Ana", "Albert", "Albort", "Rob", "Robb", "Tommy", "Tommie")


> sapply(names.list,function(x) ifelse(x %in% names(misspell.list),misspell.list[[x]],x))
    Anna      Ana   Albert   Albort      Rob     Robb    Tommy   Tommie 
   "Ana"    "Ana" "Albert" "Albert"    "Rob"    "Rob"  "Tommy"  "Tommy" 

问题是,拼写错误的.list和fix.list由adist()自动创建。我将使用此信息更新/编辑问题。问题是,拼写错误的.list和fix.list由adist()自动创建。我将使用此信息更新/编辑问题。这是最正确的答案:在我的原始案例中,
length(unique(names.list))
=653。来自@andrew的sapply()解决方案也获得了同样的结果。这是最正确的答案:在我最初的例子中,在for循环修复之后,
length(unique(names.list))
=653。来自@AndrewI的sappy()解决方案无法指出原因,但match()解决方案返回我的
length(unique(names.list))
=656,而我的for循环和@Andrew sappy()在我的原始名称上返回
length(unique(names.list))
=653解决方案返回我的
length(unique(names.list))
=656,而我的for循环和@Andrew sappy()返回我的原始names.list上的
length(unique(names.list))
=653
sapply(seq_along(fix.list), function(x)
  names.list[names.list == misspell.list[x]]  <<- fix.list[x]
)

names.list
[1] "Ana"    "Ana"    "Albert" "Albert" "Rob"    "Rob"    "Tommy"  "Tommy" 
misspell.list  <-  list(
  'Anna' = 'Ana',
  'Albort' = 'Albert',
  'Robb' = 'Rob',
  'Tommie' = 'Tommy'
)

names.list <- c("Anna", "Ana", "Albert", "Albort", "Rob", "Robb", "Tommy", "Tommie")


> sapply(names.list,function(x) ifelse(x %in% names(misspell.list),misspell.list[[x]],x))
    Anna      Ana   Albert   Albort      Rob     Robb    Tommy   Tommie 
   "Ana"    "Ana" "Albert" "Albert"    "Rob"    "Rob"  "Tommy"  "Tommy" 
sapply(names.list[sample(1:length(names.list),20,replace = T)],function(x) ifelse(x %in% names(misspell.list),misspell.list[[x]],x))
  Albert   Tommie      Rob   Tommie      Rob    Tommy      Ana     Robb   Tommie      Ana   Tommie   Albort      Ana   Albert   Albert   Albort 
"Albert"  "Tommy"    "Rob"  "Tommy"    "Rob"  "Tommy"    "Ana"    "Rob"  "Tommy"    "Ana"  "Tommy" "Albert"    "Ana" "Albert" "Albert" "Albert" 
   Tommy    Tommy    Tommy      Ana 
 "Tommy"  "Tommy"  "Tommy"    "Ana"