【问题标题】:For Loop Over List of Data Frames and Create New Data Frames from Every Iteration Using Variable NameFor 循环遍历数据框列表并使用变量名称从每次迭代中创建新数据框
【发布时间】:2016-11-16 06:58:38
【问题描述】:

我一生都无法弄清楚我的 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 &lt;- test 13 次(对于每个数据帧),但我故意尝试编写一个 for 循环或 lapply() 以获得更多 R 知识,因为我确信效率更高。

【问题讨论】:

  • 试试test &lt;- rbind(bcm,get(i))。确实有些lapply 可能很方便。

标签: r loops for-loop lapply


【解决方案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”列获得包含匹配项的数据框列表。

【讨论】:

  • 对不起,如果我不是更清楚。我总共有大约 13 个数据框,我想对其进行相同的分析以在 $Full.Name 中找到重复的行。我可以执行循环的前 4 行,然后执行 dupl.john &lt;- test 13 次(对于每个数据帧),但我故意尝试编写一个 for 循环或 lapply() 以获得更多 R 知识,因为我确信效率更高。
  • 感谢您的编辑。这更符合我正在尝试做的事情。但是,我要解决的最后一件事是我的解释(或缺乏解释)可能引起的问题。我想保留$Full.Name 之前的所有行匹配。所以我目前正在试验join() 而不是match_df()。如果您有时间对此进行研究,将不胜感激。否则,由于我最初问题的措辞,我可以接受您的编辑作为答案。
  • 当然可以,但恐怕我不完全理解你提到的最后一个问题。 Full.Name 是所有数据框的公共列,对吧?所有数据框都具有相同的列吗? AFAIU,您希望匹配所有 13 个数据框中的行,其中列 Full.Name 等于 bcm 中任何行的列 Full.Name。那是对的吗?如果是这样,是否要根据该列对匹配行的所有列进行“连接”操作?
  • 我将提供一个可能更有意义的示例: jane 有一个联系人的Full.NamePhone.Numberbcm 有一个联系人的Full.NamePhone.Number。我基本上想要rbind() 并在Full.Name 上有匹配项时显示两行(每个数据帧中的一行),这样我就可以手动清理这些在我们存储的Phone.Number 中的差异。可能有一种更简单的方法可以使用 R 并通过Full.Name 查找列中的不匹配,但这是我目前正在处理的方法。
  • 好吧,这个怎么样:res &lt;- lapply(l, function(x) {join(x, bcm, by = "Full.Name", type = "inner")} ) 使用这种方法,您最终会将两个电话号码放在同一行(而不是在不同的行),但您也可以分辨两个数字之间的差异。
猜你喜欢
  • 2019-02-25
  • 2023-02-04
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多