繁体   English   中英

R:循环中的gsub替换名称

[英]R: gsub in a loop to replace names

我有一个包含名称的大型数据集(超过60.000行)。 但是,写下名称的格式有所不同,并且为了提高数据质量,我需要以单一格式重新编码名称。 而不是复制粘贴recode-command,我想这样做,例如,在一个循环中。 我列出了所有写错的名字,以及所有相应写错的名字。

因此,基本上,我想做的是:将list1中的名称1替换为list2中的名称1,然后将list2中的名称2替换为list2中的名称2等。使用gsub似乎没什么大不了的? 但...

我似乎很接近,但是输出仍然不是我想要的。 有谁知道为什么或者比我现在做的更好的解决方案?

> dput(list1)
c("Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7", 
"Name8", "Name9", "Name10")
> dput(list2)
c("test1", "test2", "test3", "test4", "test5", "test6", "test7", 
"test8", "test9", "test10")

我添加了打印命令,以查看实际发生的事情,它似乎可以正常工作:

for (i in 1:length(list1)){
  newlist <- gsub(paste0("\\<",list1[i], "\\>"), list2[i], list1)
  print(i)
  print(newlist[i])
}


[1] 1
[1] "test1"
[1] 2
[1] "test2"
[1] 3
[1] "test3"
[1] 4
[1] "test4"
[1] 5
[1] "test5"
[1] 6
[1] "test6"
[1] 7
[1] "test7"
[1] 8
[1] "test8"
[1] 9
[1] "test9"
[1] 10
[1] "test10"

但是当我问新列表是什么样子时:

> newlist
 [1] "Name1"  "Name2"  "Name3" 
 [4] "Name4"  "Name5"  "Name6" 
 [7] "Name7"  "Name8"  "Name9" 
[10] "test10"

另外,我尝试使用lapply并编写自己的函数...都没有解决我想要的方式:(

在循环外定义您的新列表,并在循环中一次仅更改一个索引

newlist = list1
for (i in 1:length(list1)){
  newlist[i] <- gsub(paste0("\\<",list1[i], "\\>"), list2[i], list1)[i]
}

您可以使用sapply(list1, function(x) paste0("\\\\b",x,"\\\\b"))list1 sapply(list1, function(x) paste0("\\\\b",x,"\\\\b"))创建正则表达式模式,然后将模式列表和替换列表一起传递给qdap::mgsub函数

list1 <- c("Name1", "Name2", "Name3", "Name4", "Name5", "Name6", "Name7", "Name8", "Name9", "Name10")
list2 <- c("test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8", "test9", "test10")
regList1 <- sapply(list1, function(x) paste0("\\b",x,"\\b"))
qdap::mgsub(regList1, list2, "Name1 should be different. Name10, too.", fixed=FALSE)
## => [1] "test1 should be different. test10, too."

如果list1字符向量中的项目全部由字母数字或_字符组成,则此解决方案将起作用。 否则,您还需要转义值,并按照此处所述使用PCRE regex。

您可以使用mapply进行此mapply

mapply(function(x, y){
  gsub(paste0("\\<",x, "\\>"), y, x)
}, list1, list2)

   Name1    Name2    Name3    Name4    Name5    Name6    Name7    Name8    Name9   Name10 
 "test1"  "test2"  "test3"  "test4"  "test5"  "test6"  "test7"  "test8"  "test9" "test10" 

unname()环绕起来以摆脱名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM