我有一个包含两个变量的数据框。假设我的数据框是 df,那么这两个变量是 df$id 和 df$address。 df$address 包含完整地址,如 TT Road, Bhopal, Madhya Pradesh 462003。我有另一个数据框包含 10 个地方,其中 10 个是 bhopal。所以我只想在新专栏中返回博帕尔。这是一个示例,我有超过 200000 个 ID 和 300 个地名。 下面是例子
数据框 1:
df <- data.frame(id = c("297308272","297308281","297308299"), address = c("MGROAD, AMBIKAPUR, CH-546453","TT Road, Bhopal, Madhya Pradesh 462003","STREET NO. 2, WHITEFIELD, PALI, RJ"))
数据框 2:
AD <- data.frame(place = c("Bhopal", "Pali", "Wardha", "AMBIKAPUR", "Anuhul"))
最佳答案
让我们首先将 data.frame 的整个地址列和位置向量转换为小写。
df$address<-tolower(df$address)
#> df
# id address
#1 297308272 mgroad, ambikapur, ch-546453
#2 297308281 tt road, bhopal, madhya pradesh 462003
place<-tolower(place)
#> place
# "bhopal" "pali" "wardha" "ambikapur"
# [5] "anuhul"
现在让我们使用“”作为分隔符将字符串拆分为单词。为此,我们将使用 R 中的 strsplit
。
listofstrvec<-strsplit(x = df$address,split = " ")
#> listofstrvec
# [[1]]
# [1] "mgroad," "ambikapur," "ch-546453"
# [[2]]
# [1] "tt" "road," "bhopal," "madhya" "pradesh"
# [6] "462003"
现在我们有一个字符串向量列表。现在我们将尝试更多地清理这些字符串。我们将使用 R 中的 gsub
函数来删除不需要的标点符号。这一步您可能需要尝试一些组合,具体取决于您的数据有多脏。
listofstrvec<-lapply(listofstrvec,FUN = gsub,pattern="[\\,\\.\\-]",replacement= "")
#> listofstrvec
# [[1]]
# [1] "mgroad" "ambikapur" "ch546453"
# [[2]]
# [1] "tt" "road" "bhopal" "madhya" "pradesh"
# [6] "462003"
现在我们将尝试将 places 中的位置与向量中的每个字符串进行匹配
。
matched.place<-lapply(X = listofcharvec,FUN = match,table=place)
#> matched.place
#[[1]]
#[1] NA 4 NA
#[[2]]
#[1] NA NA 1 NA NA NA
最后,结合使用 sapply
、is.na
和 length
函数,您可以获得向量中的位置。
df$place<-sapply(matched.place,function(t){ifelse(test = (length(!is.na(t))>0),
yes = place[t[!is.na(t)]],no = NA)})
#> df
# id address place
#1 297308272 mgroad, ambikapur, ch-546453 ambikapur
#2 297308281 tt road, bhopal, madhya pradesh 462003 bhopal
关于r - 如何从另一个数据框中的文本列表中的 r 中的列返回特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44697812/