感谢您的帮助。
我有两个数据框。数据帧具有不同的长度。一个是通常包含错误的数据集。另一个是一组修正。我试图用这两个数据集同时做两件事。首先,我想将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[]
的括号内,该函数调用该列中的两个元素,但我试图概括。
答案 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