【问题标题】:Create new df using subset使用子集创建新的 df
【发布时间】:2019-03-18 03:29:10
【问题描述】:

我正在处理一组文档,需要将 groupby 和子集自动化到新文件中。我可以手动完成此操作,但有超过 200 个文档,每个文档大约有 45,000 个观察值,从而产生超过 1,000 个文档。我的想法是对于我的 df 中唯一值的每个实例,将具有该唯一名称的所有值保存到具有该名称的 df 中。在以下示例中,我现在将有 3 个数据帧,称为:ferrari、ford 和 audi。

value <-  c(1:10)
name <-  c("ferrari","ferrari","ferrari","ford","ford","ford","ford","audi","audi","audi")
data <- data.frame(value,name)
uniques <- unique(data$name)

for(file in uniques){
  file <- subset(data, data$Name == file)
}

这只会产生一个名为 df 的文件,其中包含 0 个观察值。我还尝试了长度为 df 的 i 的法线。非常感谢任何帮助 - 我绝对不习惯编写 for 循环。

【问题讨论】:

  • 我想你只是想要split(x = data,f = data$name)。从广义上讲,在 R 中创建许多具有不同名称的独立但相关的对象是不好的做法。最好将它们全部放在一个列表中。您可以使用names() 更改列表元素的名称。
  • 您能否详细说明您的预期结果是什么?我真的不关注。
  • @Roman 结果将是三个数据帧:1 个命名为 ferrari,仅包含来自 ferrari 的值,1 个命名为 for,仅包含来自 ford 的值,1 个命名为 audi,仅包含来自 audi 的值
  • 我的建议仍然有效。循环通过split 创建的单个列表并将每个元素保存为 excel 文件很简单。更好的是,您可以遍历名称,按名称选择每个元素并在结果文件中使用该名称。容易得多。
  • @MichaelCantrall 感谢您的澄清!现在我明白了。您的方法也应该有效。您的循环应该遍历uniques[i] 以获取uniques 的所有实例。

标签: r


【解决方案1】:

你只需要split:

> split(x = data,f = data$name)
$audi
   value name
8      8 audi
9      9 audi
10    10 audi

$ferrari
  value    name
1     1 ferrari
2     2 ferrari
3     3 ferrari

$ford
  value name
4     4 ford
5     5 ford
6     6 ford
7     7 ford

根据您的要求,这会产生三个名为 audi、ferrari 和 ford 的数据帧。您希望对每个子集执行的任何进一步操作都可以在此列表中的一个简单的 for 循环中完成(或者如果您想更花哨,可以使用 lapply 或 purrr 中的工具)。

【讨论】:

    【解决方案2】:

    joran 的解决方案很优雅,但也可以使用您的方法。将所有子集保存到 Excel 文件中的简单 for 循环单行器。

    > audi.xlsx
       value name
    8      8 audi
    9      9 audi
    10    10 audi
    
    > ferrari.xlsx
      value    name
    1     1 ferrari
    2     2 ferrari
    3     3 ferrari
    
    > ford.xlsx
      value name
    4     4 ford
    5     5 ford
    6     6 ford
    7     7 ford
    

    代码

    for(i in 1:length(uniques)){
        write.xlsx(subset(data, data$name == uniques[i]), paste0(uniques[i], ".xlsx"))
    }
    

    数据

    library(xlsx)
    data <- data.frame(value = c(1:10),
                       name = c(rep("ferrari",3), rep("ford",4), rep("audi",3)))
    uniques <- unique(as.character(data$name))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-10
      • 2020-01-06
      相关资源
      最近更新 更多