对于循环数据帧列表并使用变量名称从每次迭代创建新数据帧

时间:2016-07-13 15:28:05

标签: r loops for-loop lapply

我不能为我的生活弄清楚我的for循环中的简单错误在多个数据帧上执行相同的分析,并使用与额外字符串一起使用的变量输出每个迭代的新数据帧以识别新数据帧。

这是我的代码:

johnjane是我希望循环的两个数据框,并与bcm进行比较以查找行中的重复结果。

x <- list(john,jane)

for (i in x) {
  test <- rbind(bcm,i)
  test$dups <- duplicated(test$Full.Name,fromLast=T)
  test$dups2 <- duplicated(test$Full.Name)
  test <- test[which(test$dups==T | test$dups2==T),]
  newname <- paste("dupl",i,sep=".")
  assign(newname, test)
}

到目前为止,我可以使命名正常工作而不包括x数据或循环以正确完成而无需正确命名新数据帧。

预期结果:我希望创建新的数据框dupl.johndupl.jane,以显示与bcm相比哪些行重复。

我理解lapply()可能更好用,并且对这种形式的解决方案非常开放。我无法弄清楚如何使用它来解决我的问题,所以我转向更熟悉的for循环。

编辑

很抱歉,如果我不是更清楚的话。我总共有大约13个数据框,我想运行相同的分析来查找$Full.Name中的重复行。我可以执行循环的前4行,然后dupl.john <- test 13次(对于每个数据帧),但我故意尝试编写for循环或lapply()以获得更多R的知识,因为我相信它更有效率。

1 个答案:

答案 0 :(得分:1)

如果我根据您的预期结果正确理解,可以使用match_df作为选项。

library(plyr)
dupl.john <- match_df(john, bcm)
dupl.jane <- match_df(jane, bcm)

dupl.john和dupl.jane都是数据框,两者都有这些数据框和bcm中的行。这是你想要实现的目标吗?

在第一条评论后编辑

library(plyr)
l <- list(john, jane)
res <- lapply(l, function(x) {match_df(x, bcm, on = "Full.Name")} )
dupl.john <- as.data.frame(res[1])
dupl.jane <- as.data.frame(res[2])

现在,res将根据“Full.Name”列显示包含匹配项的数据框列表。