使用Apply Family搜索和替换两个数据帧

时间:2014-09-12 09:31:39

标签: r search for-loop replace apply

我正在尝试分析大量数据,因此我不能使用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]);
}

你能帮忙将循环转换为应用函数以加速它吗?

提前致谢

1 个答案:

答案 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

中匹配多个名称