【问题标题】:R define dimensions of empty data frameR定义空数据框的维度
【发布时间】:2012-04-12 15:18:07
【问题描述】:

我正在尝试从数据集的多个子集中收集一些数据,并且需要创建一个数据框来收集结果。我的问题是不知道如何创建一个具有定义列数的空数据框,而实际上没有数据要放入其中。

collect1 <- c()  ## i'd like to create empty df w/ 3 columns: `id`, `max1` and `min1`

for(i in 1:10){
collect1$id <- i
ss1 <- subset(df1, df1$id == i)
collect1$max1 <- max(ss1$value)
collect1$min1 <- min(ss1$value)
}

我觉得问这个问题很愚蠢(我几乎觉得我以前在 SO 上问过这个问题但找不到)但非常感谢任何帮助。

【问题讨论】:

标签: r


【解决方案1】:

NAs 的数据框可以工作吗? 类似:

data.frame(matrix(NA, nrow = 2, ncol = 3))

如果您需要更具体地了解数据类型,那么您可能更喜欢:NA_integer_NA_real_NA_complex_NA_character_,而不仅仅是 NA,这是合乎逻辑的

可能比NAs 更具体的其他内容:

data.frame(matrix(vector(mode = 'numeric',length = 6), nrow = 2, ncol = 3))

模式可以是任何类型。见?vector

【讨论】:

  • 这是我一般的做法。
【解决方案2】:

只需创建一个空向量的数据框:

collect1 <- data.frame(id = character(0), max1 = numeric(0), max2 = numeric(0))

但是,如果您提前知道将有多少行,则应该从创建具有那么多行的数据框开始。

【讨论】:

  • 我一般会使用NA:data.frame(a = NA, b = NA, C = NA).
  • 但这不会创建一个空数据框:它是一个单行数据框,恰好是所有缺失值。
  • 没错,但在我的辩护中,可以省略节日后的第一行。 :) 看看 OP 问题背后的目的是什么会很有趣。我认为可以使用 apply 和 do.call 来解决问题。
【解决方案3】:

你可以这样做:

N <- 10
collect1 <- data.frame(id   = integer(N),
                       max1 = numeric(N),
                       min1 = numeric(N))

现在请注意,在其余代码中,您忘记使用行索引逐行填充 data.frame。应该是:

for(i in seq_len(N)){
   collect1$id[i] <- i
   ss1 <- subset(df1, df1$id == i)
   collect1$max1[i] <- max(ss1$value)
   collect1$min1[i] <- min(ss1$value)
}

最后,我想说的是,有很多替代方法可以完成您想要完成的工作,其中一些会更有效率并且使用更少的打字。例如,您可以查看 aggregate 函数或 plyr 包中的 ddply

【讨论】:

    【解决方案4】:

    您可以使用NULL 代替NA。这会创建一个真正的空数据框。

    【讨论】:

    • 这是迄今为止最简单的答案。它仍然不知道列的数据类型,并且默认情况下它不会像其他一些答案那样创建第一行。
    • 你的意思是矩阵()中的 NULL。矩阵出错(NULL,nrow = 0,ncol = 3):“数据”必须是向量类型,为“NULL”
    • @JerryT data.frame(x = NULL, y = NULL) 或只是 data.frame() 创建空数据框但不允许使用某些循环填充值
    【解决方案5】:
    df = data.frame(matrix("", ncol = 3, nrow = 10))  
    

    【讨论】:

    • 在创建 df 时最好使用“NA”而不是“”。否则所有列都是一个级别的因子。
    • 很好的解决方案,但错过了一个额外的结尾)。因为我真的不喜欢因素,所以我使用小标题:dplyr::as_tibble(matrix(NA, ncol = 3, nrow = 10))。您可以使用NA_character_NA_integer 等强制数据类型。
    【解决方案6】:

    如果您想要一个具有已定义行数和 NO 列的空数据框,这是一个解决方案:

    df = data.frame(matrix(NA, ncol=1, nrow=10)[-1]
    

    【讨论】:

    • 在 [-1] 之前缺少 )
    【解决方案7】:

    这可能有助于另一个论坛中给出的解决方案, 基本上是: 即

    Cols <- paste("A", 1:5, sep="")
    DF <- read.table(textConnection(""), col.names = Cols,colClasses = "character")
    
    > str(DF)
    'data.frame':   0 obs. of  5 variables:
    $ A1: chr
    $ A2: chr
    $ A3: chr
    $ A4: chr
    $ A5: chr
    

    您可以更改 colClasses 以满足您的需要。

    原链接是 https://stat.ethz.ch/pipermail/r-help/2008-August/169966.html

    【讨论】:

      【解决方案8】:

      创建任意大小数据框的更通用方法是从相同维度的矩阵创建 n×1 数据框。然后,您可以立即删除第一行:

      > v <- data.frame(matrix(NA, nrow=1, ncol=10))
      > v <- v[-1, , drop=FALSE]
      > v
       [1] X1  X2  X3  X4  X5  X6  X7  X8  X9  X10
      <0 rows> (or 0-length row.names)
      

      【讨论】:

      • 您可以用nrow=0创建矩阵,而不是删除第一行
      【解决方案9】:

      如果只有列名可用,例如:

      cnms <- c("Nam1","Nam2","Nam3")
      

      要使用上述变量名创建一个空数据框,首先创建一个data.frame 对象:

      emptydf <- data.frame()
      

      现在调用每列的第零个元素,从而创建一个具有给定变量名称的空数据框:

      for( i in 1:length(cnms)){
           emptydf[0,eval(cnms[i])]
       }
      

      【讨论】:

        【解决方案10】:

        seq_along 可能有助于找出数据文件中有多少行并创建具有所需行数的 data.frame

            listdf <- data.frame(ID=seq_along(df),
                                      var1=seq_along(df), var2=seq_along(df))
        

        【讨论】:

          【解决方案11】:

          我遇到了同样的问题,并且有一个更清洁的解决方案。您可以将数据保存为命名列表,而不是创建一个空的data.frame。将所有结果添加到此列表后,您可以将其转换为 data.frame。

          对于一次添加一个功能的情况,这种方法效果最好。

          mylist = list()
          for(column in 1:10) mylist$column = rnorm(10)
          mydf = data.frame(mylist)
          

          对于一次添加一行的情况,由于混合类型,这变得很棘手。如果所有类型都相同,那很容易。

          mylist = list()
          for(row in 1:10) mylist$row = rnorm(10)
          mydf = data.frame(do.call(rbind, mylist))
          

          我还没有找到添加混合类型行的简单方法。在这种情况下,如果你必须这样做,空的 data.frame 可能是最好的解决方案。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-12-09
            • 1970-01-01
            • 1970-01-01
            • 2020-07-18
            • 1970-01-01
            • 2018-10-11
            • 1970-01-01
            相关资源
            最近更新 更多