在R中,比较不同长度的矢量以匹配和替换值

时间:2017-09-26 20:48:56

标签: r replace match

感谢您的帮助。

我有两个数据框。数据帧具有不同的长度。一个是通常包含错误的数据集。另一个是一组修正。我试图用这两个数据集同时做两件事。首先,我想将df1的三列与df2中的三列进行比较。这意味着读取df1中的第一行数据,并查看这三个变量是否与df2中的任何行匹配这三个变量,然后继续前进到第2行,依此类推。如果在所有三个变量的行中找到匹配项,则将df1中的一列中的值替换为df2中的替换值。我在下面列举了一个例子。

df1 <- data.frame("FIRM" = c("A", "A", "B", "B", "C", "C"), "LOCATION" = c("N", "S", "N", "S", "N", "S"), "NAME" = c("Apple", "Blooberry", "Cucumber", "Date", "Egplant", "Fig"))
df2 <- data.frame("FIRM" = c("A", "C"), "LOCATION" = c("S", "N"), "NAME" = c("Blooberry", "Egplant"), "NEW_NAME" = c("Blueberry", "Eggplant"))
df1[] <- lapply(df1, as.character)
df2[] <- lapply(df2, as.character)

如果df1中有一行符合&#34; FIRM&#34;,&#34; LOCATION&#34;和#34; NAME&#34;在df2,然后我想替换&#34; NAME&#34;在df1与&#34; NEW_NAME&#34;在df2中,&#34; Blooberry&#34;和&#34; Egplant&#34;改为&#34;蓝莓&#34;和#34;茄子&#34;。

我可以使用*:

进行最后的替换
df1$NAME[match(df2$NAME, df1$NAME)] <- df2$NEW_NAME[match(df1$NAME[match(df2$NAME, df1$NAME)], df2$NAME)]

但这不包括三场比赛的约束。此外,我的代码似乎与嵌套匹配函数不必要地复杂。我想我可以通过对df2进行子集化并使用for循环来逐行匹配行来完成此任务,但我认为有更好的向量化方法。

*我知道在df2$NEW_NAME[]的括号内,该函数调用该列中的两个元素,但我试图概括。

1 个答案:

答案 0 :(得分:2)

考虑使用merge条件比较 NAME 并考虑 all.x LEFT JOIN(即,SQL中的ifelse NEW_NAME

下面,transform允许相同的行列分配,结束时括号内的序列保留前三列。

mdf <- transform(merge(df1,df2,all.x=TRUE),NAME=ifelse(is.na(NEW_NAME),NAME,NEW_NAME))[1:3]
mdf
#   FIRM LOCATION      NAME
# 1    A        N     Apple
# 2    A        S Blueberry
# 3    B        N  Cucumber
# 4    B        S      Date
# 5    C        N  Eggplant
# 6    C        S       Fig