我正在尝试分析大量数据,因此我不能使用for循环从另一个数据框中搜索ID并替换文本。
基本上,第一个数据框是ID,没有名称。名称位于其他数据框中。
(编辑)输入dfs
(编辑) df1
ID------Name 1,2,3---NA 4,5-----NA 6-------NA
(编辑) df2
ID------Name 1-------John 2-------John 3-------John 4-------Stacy 5-------Stacy 6-------Alice
(编辑)预期输出df
ID------Name 1,2,3---John 4,5-----Stacy 6-------Alice
(编辑)请注意,这是非常简化的版本。 df1实际上有63列和8551行,df2有5列和37291行。
我可以像这样在第二个数据框中搜索ID并获取名称。它超级快!
namer <- function(df2, ids) {
ids <- gsub(',', '|', ids);
names <- df2[which(apply(df2, 1, function(x) any(grepl(ids, x)))),][['Name']];
if (length(names) != 0) {
return(names[[1]]);
} else {
return(NA);
}
}
但是,我不能替换使用申请家庭。我知道用for循环来做这件事并且它非常慢,因为我在第一个数据框中有大约8500行。
for (k in 1:nrow(df1)) {
df1$Name[k] <- namer(df2, df1$ID[k]);
}
你能帮忙将循环转换为应用函数以加速它吗?
提前致谢
答案 0 :(得分:2)
你可以尝试
df1$Name <- sapply(as.character(df1$ID),
function(x) paste(unique(df2[match(strsplit(x, ",")[[1]], df2$ID), "Name"]), collapse = ","))
df1
# ID Name
# 1 1,2,3 John
# 2 4,5 Stacy
# 3 6 Alice
虽然我怀疑sapply
会比for
循环更快。我还在此处添加了paste
功能,以防您在df1$ID