【问题标题】:Creating and filling a dataframe per row from the script (i.e. without using separate vectors for the columns)从脚本中创建和填充每行的数据框(即不使用单独的列向量)
【发布时间】:2020-02-17 12:34:01
【问题描述】:

我正在尝试从“记录”列表创建一个数据框,即每行(与加载 CSV 文件相比,但现在从 R 脚本文件中),但我能找到的所有示例都创建来自包含各个列的向量的数据框。

我发现最接近的是从一个空数据框开始,然后使用 rbind 和列表添加行,但随后原始列名丢失并且所有列都有类字符。

> generations <- data.frame(launch_date=as.Date(integer(), origin="1970-01-01"), generation=character(), stringsAsFactors=FALSE)
> generations
[1] launch_date generation 
<0 rows> (or 0-length row.names)

这里一切都好。现在:

> generations <- rbind(generations,list("2010-09-01", "Generation 1"), stringsAsFactors=FALSE)
> generations
  X.2010.09.01. X.Generation.1.
1    2010-09-01    Generation 1
> str(generations)
'data.frame':   1 obs. of  2 variables:
 $ X.2010.09.01.  : chr "2010-09-01"
 $ X.Generation.1.: chr "Generation 1"

原来的列名和类消失了:(

想要这样的原因是在单独的向量中维护数据很麻烦并且容易出错。所以这里的想法是使用带有一堆列表的 rbind,其中日期和名称可以一起维护(即成对,每个“记录”/行)。

这个怎么办?

【问题讨论】:

    标签: r


    【解决方案1】:

    您与rbind 处于(可能的众多)正确轨道上。列名丢失是由于您传递了rbind list 而不是data.frame。相反,如果我们将两个 data.frame 对象传递给它:

    这与您的示例中的初始化代码相同:

    generations <- data.frame(launch_date=as.Date(integer(), origin="1970-01-01"), generation=character(), stringsAsFactors=FALSE)
    

    但是现在我们将另一个data.frame 作为第二个参数传递给rbind

    generations <- rbind(generations,
                         data.frame(launch_date=as.Date("2010-09-01", origin="1970-01-01"), generation="Generation 1", stringsAsFactors=FALSE))
    

    现在

    str(generations)
    

    返回:

    'data.frame':   0 obs. of  2 variables:
    $ launch_date: 'Date' num(0) 
    $ generation : chr 
    

    【讨论】:

    • 使用此解决方案,我将不得不为每一行(即行)数据重复完整的 data.frame 语句;正确的? (我正在寻找一种允许我维护日期字符串对的解决方案)
    • 您可以在循环或应用函数中使用它(重复每一行行!)。或者,您在 rbind 步骤中完全省略名称并在最后添加它们。但是您只能将日期列绑定到日期列,否则它们将成为字符(R 总是回退到最通用的类​​型。并且所有内容都可以表示为字符串 - 这就是您获得类字符的原因)
    【解决方案2】:

    我找到了一种更简单的方法来实现这一点,从矩阵开始,然后将其转换为数据框:

    generations_matrix <- matrix(data=c(
        "2014-04-01", "Generation 1",
        "2016-06-01", "Generation 2",
        "2018-01-01", "Generation 3"
        ), ncol = 2, dimnames=list(NULL,c("launch_date", "generation")), byrow=TRUE)
    generations <- data.frame(
        launch_date=as.Date(generations_matrix[,1]), generation=generations_matrix[,2],
        stringsAsFactors=FALSE)
    

    结果:

    > generations
      launch_date   generation
    1  2014-04-01 Generation 1
    2  2016-06-01 Generation 2
    3  2018-01-01 Generation 3
    > str(generations)
    'data.frame':   3 obs. of  2 variables:
     $ launch_date: Date, format: "2014-04-01" "2016-06-01" ...
     $ generation : chr  "Generation 1" "Generation 2" "Generation 3"
    

    这正是我一直在寻找的:一种在每行一行中定义和维护数据框的方法。

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 2023-03-07
      • 1970-01-01
      • 2020-01-14
      • 2021-04-10
      • 2014-11-09
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多