【问题标题】:Fill a data frame with NA in R在R中用NA填充数据框
【发布时间】:2016-06-18 02:02:50
【问题描述】:

假设我有一个类似 myData 的数据集:

set.seed(1234)

Date <- seq(as.Date("1990-01-01"), as.Date("1990-12-01"), "months")
Date <- rep(Date, 5)

Species <- rep(c("cat", "lion", "tiger", "leopard", "cheetah"), each=12)

Measurement <- rnorm(60)

index <- sample(1:60, 10)

myData <- data.frame(Date[-index], Species[-index], Measurement[-index])

注意 myData 没有 Date 和 Species 之间的所有可能组合。有 10 行缺失。我想创建一个新的数据框(假设是 myData2),其中包含 Date 和 Species 之间的所有可能组合,即 myData 2 将有 60 行。如果 myData 中存在 Date 和 Species 的特定组合,myData2 中的 Measurement 值应该是其原始值;如果缺少此组合,则应该是 NA。

我正在尝试使用两个嵌套的 for 循环来完成此操作,但它不起作用。我知道我犯了错误,但我不知道它们是什么。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您正在寻找 tidyr 包中的 complete 函数,该函数专为您的目的而设计:

    tidyr::complete(myData, Date, Species)
    
    # Source: local data frame [60 x 3]
    # 
    #          Date Species Measurement
    #        (date)  (fctr)       (dbl)
    # 1  1990-01-01     cat  -1.2070657
    # 2  1990-01-01 cheetah  -0.5238281
    # 3  1990-01-01 leopard  -2.1800396
    # 4  1990-01-01    lion  -0.7762539
    # 5  1990-01-01   tiger  -0.6937202
    # 6  1990-02-01     cat   0.2774292
    # 7  1990-02-01 cheetah  -0.4968500
    # 8  1990-02-01 leopard  -1.3409932
    # 9  1990-02-01    lion          NA
    # 10 1990-02-01   tiger          NA
    # ..        ...     ...         ...
    

    【讨论】:

    • 我正在尝试你所说的,但我收到一个错误:“错误:无法加入列 'Date' x 'Date': index out of bounds”
    • 请注意,您的数据未正确命名。重命名您的数据,然后相应地使用列名。
    • 是的。我没注意到。谢谢!
    【解决方案2】:

    我们不需要包裹。使用expand.grid from base R 可以轻松完成

    merge(expand.grid(Date=unique(myData$Date), 
          Species=as.character(unique(myData$Species))), myData, all.x=TRUE)
    

    数据

    myData <- data.frame(Date= Date[-index], Species = Species[-index], 
                      Measurement = Measurement[-index])
    

    【讨论】:

      【解决方案3】:

      为了完整起见,这里也是data.table的解决方案:

      library(data.table)
      setDT(myData)[CJ(Date = Date, Species = Species, unique = TRUE), on = .(Date, Species)]
      
                Date Species Measurement
       1: 1990-01-01     cat  -1.2070657
       2: 1990-01-01 cheetah  -0.5238281
       3: 1990-01-01 leopard  -2.1800396
       4: 1990-01-01    lion  -0.7762539
       5: 1990-01-01   tiger  -0.6937202
       6: 1990-02-01     cat   0.2774292
       7: 1990-02-01 cheetah  -0.4968500
       8: 1990-02-01 leopard  -1.3409932
       9: 1990-02-01    lion          NA
      10: 1990-02-01   tiger          NA
      11: 1990-03-01     cat   1.0844412
      12: 1990-03-01 cheetah  -1.8060313
      13: ...
      

      它使用CJ()交叉连接)创建DateSpecies 的所有唯一组合,并将其与myData 连接起来。这类似于Akrun's base R approach

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-23
        • 2018-01-16
        • 2022-11-08
        • 2021-12-26
        • 2023-03-29
        • 1970-01-01
        相关资源
        最近更新 更多