【问题标题】:R: Insert a vector as a row in data.frameR:在data.frame中插入一个向量作为一行
【发布时间】:2011-04-08 17:58:38
【问题描述】:

我可以在data.frame 中插入vector 作为一行吗?如果有怎么办?

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    我不会声称这是目前最优雅、最漂亮的解决方案,但它可以完成工作。 请注意,每个数据框行都有自己的行名,这在插入新行时会成为问题。话虽如此,您可以使用row.names 来解决这个问题(见下文)。

    my.df <- data.frame(a = runif(10), b = runif(10), c = runif(10))
    my.vec <- c(1, 1, 1)
    new.df <- rbind(my.df[1:5, ], my.vec, my.df[6:nrow(my.df), ])
    new.df
                a         b          c
    1  0.45433791 0.3798105 0.84514864
    2  0.07074529 0.4985765 0.53912585
    3  0.09645574 0.5441647 0.96636213
    4  0.60788436 0.6070706 0.53791603
    5  0.01593911 0.1697248 0.62697924
    6  1.00000000 1.0000000 1.00000000
    61 0.98455694 0.2206702 0.85500531
    7  0.85356834 0.5279596 0.27462326
    8  0.48028935 0.6689572 0.05428349
    9  0.95675901 0.6875491 0.77642924
    10 0.24691330 0.7980741 0.24013096
    
    row.names(new.df) <- 1:nrow(new.df)  # make row names pretty again
    

    【讨论】:

    • 您可以在rbind 中使用参数make.row.names=FALSE 来命名行
    【解决方案2】:

    从向量水平制作一个 R 数据框

    关键的见解是使用 R 转置方法:t(...) 在将向量传递给 data.frame 构造函数之前对其进行转置。

    my_name_vector      = c("penguin1", "penguin2", "penguin3", "penguin4");
    my_data_vector      = c("Skipper",  "Kowalski", "Rico",     "Private");
    supplemental_vector = c("Mumble",   "Dorthy",   "Norma",    "Memphis");
    
    #create a data frame out of a transposed vector
    penguins = as.data.frame(t(my_data_vector));
    #change the names of the dataframe to be the titles
    colnames(penguins) <- my_name_vector;
    
    supplemental_data_frame <- data.frame(t(supplemental_vector));
    colnames(supplemental_data_frame) <- my_name_vector;
    supplemental_data_frame;
    
    #rbind means row bind, pass in two data.frame
    penguins <- rbind(penguins, supplemental_data_frame);
    penguins;
    

    打印:

       penguin1 penguin2 penguin3 penguin4
    1  Mumble   Dorthy   Norma    Memphis
    
       penguin1 penguin2 penguin3 penguin4
    1  Skipper  Kowalski Rico     Private
    2  Mumble   Dorthy   Norma    Memphis
    

    rbind 方法效率非常低,因此如果您要执行的操作超过几百行,预计会等待很长时间。如果您需要闪电般快速,则需要预先分配空间或使用此处所示的列表方法:https://stackoverflow.com/a/20689857/445131

    【讨论】:

      【解决方案3】:

      rbind 很好,但在处理前后的确切行号方面确实很棘手。更快速的方法是在包miscTools 中使用insertRow

      在上面的数据集示例中,代码为:

      my.df <- as.matrix(data.frame(a = runif(10), b = runif(10), c = runif(10)))
      my.vec <- c(1, 1, 1)
      new.df <- insertRow(my.df,7,my.vec)
      new.df
      

      希望对您有所帮助。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-25
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多