【问题标题】:How to fill in R data.frame with named vectors of different lengths?如何用不同长度的命名向量填充 R data.frame?
【发布时间】:2021-11-03 22:08:39
【问题描述】:

我需要使用命名向量作为行来填充 R data.frame(或 data.table)。问题是用作行的命名向量通常没有所有变量。换句话说,通常命名向量的长度小于列数。向量中的变量名称与数据框的列名一致:

df <- data.frame(matrix(NA, 2, 3))
colnames(df) <- c("A", "B", "C")
obs1 <- c(A=2, B=4)
obs2 <- c(A=3, C=10)

我想要df如下:

> df
  A  B  C
1 2  4 NA
2 3 NA 10

所以我想分别用 obs1 和 obs2 填充前两行。当我尝试这样做时,出现错误:

> df[1,] <- obs1
Error in `[<-.data.frame`(`*tmp*`, 1, , value = c(A = 2, B = 4)) : 
  replacement has 2 items, need 3

我怀疑已经有人问过类似的问题,但我找不到。有人知道如何使用 data.frame 或 data.table 吗?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我们还需要根据'obs1'和'obs2'的names选择列

    df[1, names(obs1)] <- obs1
    df[2, names(obs2)] <- obs2
    

    -输出

    > df
      A  B  C
    1 2  4 NA
    2 3 NA 10
    

    当我们执行df[1,] 时,它返回包含所有列的第一行,即length 为 3,而 'obs1' 或 'obs2' 的长度仅为 2,因此会出现长度错误


    此外,实际上不需要创建要填充的模板数据集,因为我们可以使用bind_rows,它会自动用NA 填充那些不存在的列

    library(dplyr)
    bind_rows(obs1, obs2)
    # A tibble: 2 x 3
          A     B     C
      <dbl> <dbl> <dbl>
    1     2     4    NA
    2     3    NA    10
    

    【讨论】:

      【解决方案2】:

      data.table 的解决方案;

      library(data.table)
      obs1 <- data.table(t(obs1))
      obs2 <- data.table(t(obs2))
      df <- rbindlist(list(obs1,obs2),fill=T)
      df
      

      输出;

            A     B     C
        <dbl> <dbl> <dbl>
      1     2     4    NA
      2     3    NA    10
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 2013-05-09
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多