【问题标题】:Subsetting with for loop and creating multiple data frames from that loop.使用 for 循环进行子集化并从该循环创建多个数据帧。
【发布时间】:2018-09-15 16:09:01
【问题描述】:

我正在尝试创建一个子集数据框的 for 循环。这是数据:

df1 <- data.frame(
  Number = c(45,62,27,34,37,55,40),
  Day = c("Mon", "Tues", "Wed", "Thurs", "Fri", "Sat", "Sun"),
  Time = c("1pm", "4pm", "3pm", "2pm", "4pm", "1pm", "2pm"),
  City = c("Chicago", "New York", "LA", "Miami", "San Diego", "Austin", "Dallas"))

我正在尝试的功能是:

allNames<-variable.names(df1)


for (i in allNames){
  if(any(variable.names(df1)== i)){
    i <- df1[,c(i)]
  }
}

基本上我正在尝试对数据文件进行子集化,因此最终结果将是 4 个数据集,每个数据集都有一个来自 df1 的变量,并且每个子集化的数据集将被命名为它所代表的变量。对于 df1 中的每个变量,它看起来像这样

 Number
1     45
2     62
3     27
4     34
5     37
6     55
7     40

    Day
1   Mon
2  Tues
3   Wed
4 Thurs
5   Fri
6   Sat
7   Sun

谢谢!

【问题讨论】:

  • 我想我明白你在问什么,但我想不出为什么这可能有用。例如,拥有一个名为 Number 的变量,它是一个有 1 列的 data.frame,似乎与 df1["Number"] 相比,它没有提供任何价值(实际上,增加了复杂性)。也许如果您描述了为什么您认为这是必要的,我们可以更好地建议如何做到这一点。 (通常,处理多个相似帧最好在list 帧内完成,而不是单个变量。)
  • @r2evans ...我的想法完全正确!这是XY Problem。 OP 正在为我们提供他未解释的 X 问题的 Y 解决方案。可能他需要这种格式是有原因的,如果 OP 可以为我们提供更全面的背景,它可以以不同的方式完成。
  • 没有人评论您的数据大小或变量的内容。当然,它们只是示例。我们评论说,这样做几乎没有充分的理由。 如果您与我们分享您流程中的下一步,我们几乎可以肯定地向您展示一种比您在其中提出的方法更简单、不那么繁琐且代码行数更少的方法你的问题。否则罗斯的回答基本上可以得到你想要的。
  • 杰克,没有任何敌意的理由。通常,在 R 中特别(但无意地)提出规避优化的问题是基于误解、缺乏经验或其他原因。询问“为什么”通常很有帮助,这样可以以更符合 R 效率的方式解决潜在需求。虽然我认为罗斯提供的答案从 R 的角度来看是“不是最佳实践”,但它满足您的需求,所以请接受它并继续前进。否则,请理解我们的“为什么”问题是基于我们愿意为您提供帮助的意愿。同上@Gregor。
  • @Jake,我的回答似乎足以满足您的特定需求,但如果您觉得可以,我鼓励您描述更广泛的问题。我知道我刚开始时一直在寻找类似的方法,我发现assign 非常有帮助,但随着时间的推移,我改变了我的编程方法,很少使用assign,并且感觉更好这样做。

标签: r for-loop dataframe subset


【解决方案1】:

试试:

for (i in allNames) {
  if(any(variable.names(df1)== i)) {assign(i, df1[,c(i)])}
}

【讨论】:

  • @Parfait 我不确定这是否能满足用户的要求。但是,是的,这是另一种完全有效的方法。
  • @Parfait,我认为您的技巧应该使用 sapply(..., simplify=FALSE) 以便保留名称。然后您可以将整个表达式进一步简化为as.list(df1),因为这就是正在发生的一切(只是将类从data.frame 更改为list,几乎没有任何操作)。哪个争论了最初的问题:为什么?
  • @r2evans 你知道如何解决这个问题吗?为什么无关紧要,我是在问一个特定的问题来回答一个特定的问题。如果您知道如何解决,请随时分享,如果不回答。我问了我到底想做什么。
  • 只需使用df1[,c(i), drop = FALSE] 将其保留为数据框。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2021-12-03
  • 1970-01-01
相关资源
最近更新 更多