R:循环中的gsub替换名称
R: gsub in a loop to replace names
我有一个包含姓名的大型数据集(60.000 多行)。但是,写下名称的格式不同,为了提高数据质量,我需要以单一格式重新编码名称。我不想复制粘贴重新编码命令,例如,在循环中执行此操作。我有一个所有写错的名字的列表,以及一个所有对应的正确写的名字的列表。
基本上,我想做的是:
在 list1 中使用名称 1 并替换为 list2 中的名称 1,然后在 list1 中使用名称 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 并编写了我自己的函数...但都没有按照我想要的方式运行:(
您可以使用 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()
以去掉名称。
在循环之外定义新列表,并在循环中一次只更改一个索引
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
创建正则表达式模式,然后将模式列表与替换列表一起传递到 qdap::mgsub
function:
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 正则表达式
我有一个包含姓名的大型数据集(60.000 多行)。但是,写下名称的格式不同,为了提高数据质量,我需要以单一格式重新编码名称。我不想复制粘贴重新编码命令,例如,在循环中执行此操作。我有一个所有写错的名字的列表,以及一个所有对应的正确写的名字的列表。
基本上,我想做的是: 在 list1 中使用名称 1 并替换为 list2 中的名称 1,然后在 list1 中使用名称 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 并编写了我自己的函数...但都没有按照我想要的方式运行:(
您可以使用 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()
以去掉名称。
在循环之外定义新列表,并在循环中一次只更改一个索引
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
创建正则表达式模式,然后将模式列表与替换列表一起传递到 qdap::mgsub
function:
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
字符向量中的项目全部由字母数字或 _
字符组成,则此解决方案有效。否则,您还需要转义这些值,并按