【发布时间】:2016-07-28 06:51:44
【问题描述】:
我有数据框df1 与列"Year" 和"Agent":
df1 <- structure(list(Year = c(1999, 1999, 1998), Agent = list(c("abn-amro-nv", "suntrust banks", "wachovia"), c("jp morgan", "abn-amro-nv"), c("ba-corp", "boston bks", "nbd"))), .Names = c("Year", "Agent"), row.names = c(NA, -3L), class = "data.frame")
#df1
Year Agent
1999 abn-amro-nv, suntrust banks, wachovia
1999 jp morgan, abn-amro-nv
1998 ba-corp, boston bks, nbd
我有另一个数据框df2,它有5列"Rank"、"Arrangers"、"Share"、"Issues"和"Year",如下所示:
df2 <- structure(list(Rank = 1:3, Arranger = c("jp morgan", "boston-bank", "suntrust bk"), Share = c(1.2, 1.8, 2.1), Issues = c(7L, 4L, 3L), Year = c(1999L, 1998L, 1999L)), .Names = c("Rank", "Arranger", "Share", "Issues", "Year"), class = "data.frame", row.names = c(NA, -3L))
#df2
Rank Arranger Share Issues Year
1 jp morgan 1.2 7 1999
2 boston-bank 1.8 4 1998
3 suntrust bk 2.1 3 1999
我需要将df1 的"Agent" 和"Year" 与df2 的"Arranger" 和"Year" 匹配,并从df2 中选择3 列,例如"Rank"、@9876543445@、@9876 @。
"Agent" 的 df1 与 "Arranger" 的 df2 的匹配将是模糊匹配。这是因为它们并不完全相同。
我的原始数据框非常大,仅供参考。
以下是我的代码:
library(stringdist)
leadrep <- matrix(ncol=3, nrow=length(df1$Agent))
for (i in 1:length(df1$Agent)) {
for (j in 1:length(df2$Arrangers)) {
if ((ain(df2$Arrangers[j], df1$Agent[[i]], maxDist=0.3,
method="jw")) == 'TRUE' & (df1$Year[i] == df2$Year[j])){
leadrep[i,] <- df2[j, c('Rank', 'Mkt.Share', 'NumberofIssues')]
}
}
}
在代码中,leadrep 是我创建的矩阵。这样我就可以填写for loop。我使用stringdist 包和ain 函数进行模糊匹配。我使用了两个for loop 和if 来比较字符串和年份。
上述代码有效,但由于我的数据框很大,因此需要很长时间才能获得结果。我真的认为我上面的方法不是有效的。如果有人为我现有代码提供更好的替代方案,那将是一个很大的帮助。
感谢您的所有帮助。
【问题讨论】:
-
你遇到了什么错误?
-
Error: unexpected '&' in: " if ((ain(df2$Arrangers[j], df1$Agent[[i]], maxDist=0.3, method="jw")) == 'TRUE') &"错误:“}”中出现意外的“}” -
这个问题可能会因为有一个额外的
(的简单错字而被关闭。 -
如我所见,if中的“&”之前有3个左括号和3个右括号。额外的在哪里(?。
-
@sayaa 代码需要很长时间才能获得结果。我不认为这是获得结果的有效代码/方法。也许我应该编辑我的问题并请求一个更好的替代我现有方法的方法。
标签: r record-linkage