R sapply环路将替换为for环路
我以前成功地将for loops切换到sapply loops, 我知道一个事实(system.time())就是它们更快 但我的思维仍然以一种循环的方式运作 请帮助我将此转换为循环情况: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
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"