R- 列匹配,用对应值的另一列创建新列
R- Column match, create new column with another column of corresponding value
我有两个数据框:
df1<- data.frame(place=c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN"))
df2<- data.frame(city=c("ADANA","BOLU","ANTEP","MERSIN"), neighbor=c("KARACA","ASIL","GAZI","YUKARI"))
我需要匹配列 df1$place 和 df2$neighbor。如果 df1$place 包含 df2$neighbor 中的单词,它应该通过复制 df2$city of matches 的相应值来为 df1$newcol 创建一个新列。
df1$newcol <- data.frame(place=c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN") ,city=c("ADANA","BOLU","ANTEP","MERSIN"))
这是一种方法 sapply
来自 base R:
如果您只想匹配整个单词,可以使用正则表达式。 \b
查找单词边界。
ind <- unlist(sapply(df2$neighbor, function(x) grep(paste0("\b",x,"\b"),df1$place)))
ind2 <- rep(1:length(df2$neighbor),
times = sapply(df2$neighbor, function(x) length(grep(paste0("\b",x,"\b"),df1$place))))
df1$newcol <- NA
df1$newcol[ind] <- as.character(df2$city[ind2])
df1
# place newcol
#1 KARACA ADANA ADANA
#2 ASIL BOLU BOLU
#3 GAZIANTEP <NA>
#4 YUKARI/MERSIN MERSIN
#5 YUKARI/MERSIN MERSIN
#6 GAZIANTEP <NA>
#7 ASIL BOLU BOLU
#8 KARACA ADANA ADANA
示例数据
df1<- data.frame(place=c(c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN"),
rev(c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN"))))
尝试这样做
library(tidyverse)
df1 %>%
rowwise() %>%
mutate(out = df2$city[str_which(place, df2$city)])
我有两个数据框:
df1<- data.frame(place=c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN"))
df2<- data.frame(city=c("ADANA","BOLU","ANTEP","MERSIN"), neighbor=c("KARACA","ASIL","GAZI","YUKARI"))
我需要匹配列 df1$place 和 df2$neighbor。如果 df1$place 包含 df2$neighbor 中的单词,它应该通过复制 df2$city of matches 的相应值来为 df1$newcol 创建一个新列。
df1$newcol <- data.frame(place=c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN") ,city=c("ADANA","BOLU","ANTEP","MERSIN"))
这是一种方法 sapply
来自 base R:
如果您只想匹配整个单词,可以使用正则表达式。 \b
查找单词边界。
ind <- unlist(sapply(df2$neighbor, function(x) grep(paste0("\b",x,"\b"),df1$place)))
ind2 <- rep(1:length(df2$neighbor),
times = sapply(df2$neighbor, function(x) length(grep(paste0("\b",x,"\b"),df1$place))))
df1$newcol <- NA
df1$newcol[ind] <- as.character(df2$city[ind2])
df1
# place newcol
#1 KARACA ADANA ADANA
#2 ASIL BOLU BOLU
#3 GAZIANTEP <NA>
#4 YUKARI/MERSIN MERSIN
#5 YUKARI/MERSIN MERSIN
#6 GAZIANTEP <NA>
#7 ASIL BOLU BOLU
#8 KARACA ADANA ADANA
示例数据
df1<- data.frame(place=c(c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN"),
rev(c("KARACA ADANA","ASIL BOLU","GAZIANTEP","YUKARI/MERSIN"))))
尝试这样做
library(tidyverse)
df1 %>%
rowwise() %>%
mutate(out = df2$city[str_which(place, df2$city)])