【问题标题】:How to add row and column to a dataframe of different length?如何将行和列添加到不同长度的数据框中?
【发布时间】:2018-11-18 17:24:57
【问题描述】:

我有两个不同长度的数据框:

Headers <- data.frame(x = paste0("x", 1:4), y = 1:4)
Dataset <- data.frame(H = c(20, 10, 11, 8, 10), W = c(30, 20, 30, 10, 6)) 

Headers
   x y
1 x1 1
2 x2 2
3 x3 3
4 x4 4

Dataset
   H  W
1 20 30
2 10 20
3 11 30
4  8 10
5 10  6

我需要将'x'列从'Headers'转换为标题,将'y'列转换为相应的值,然后绑定到'Dataset':

H   W  x1  x2  x3  x4
20  30  1   2   3   4
10  20  1   2   3   4
11  30  1   2   3   4
 8  10  1   2   3   4
10   6  1   2  3    4

这是我尝试过的代码:

 H <- t(Headers)
 Dataset <- cbind(H, Dataset)
 names(H)  <- NULL
 Dataset <- qpcR:::cbind.na(H, Dataset)

任何帮助将不胜感激。谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    转置“y”并重复所需的行数。将列名设置为“x”。

    cbind(Dataset, `colnames<-`(t(Headers$y)[rep(1, nrow(Dataset)), ], Headers$x))
    
       H  W x1 x2 x3 x4
    1 20 30  1  2  3  4
    2 10 20  1  2  3  4
    3 11 30  1  2  3  4
    4  8 10  1  2  3  4
    5 10  6  1  2  3  4
    

    【讨论】:

      【解决方案2】:

      data.table 方法:

      library(data.table)
      
      cbind(Dataset, dcast(Headers, . ~ x, value.var = "y")[,-1])
      

      输出:

         H  W x1 x2 x3 x4
      1 20 30  1  2  3  4
      2 10 20  1  2  3  4
      3 11 30  1  2  3  4
      4  8 10  1  2  3  4
      5 10  6  1  2  3  4
      

      tidyverse 方法:

      library(tidyverse)
      
      Headers %>%
        rownames_to_column %>%
        spread(x, y) %>%
        summarise_all(funs(first(na.omit(.)))) %>%
        cbind(Dataset, .) %>% select(-rowname)
      

      输出:

         H  W x1 x2 x3 x4
      1 20 30  1  2  3  4
      2 10 20  1  2  3  4
      3 11 30  1  2  3  4
      4  8 10  1  2  3  4
      5 10  6  1  2  3  4
      

      【讨论】:

      • 错误:var 必须计算为单个数字或列名,而不是字符向量,这是我得到的错误
      • 不确定后面会发生什么,我正在使用您的示例。也许您还没有更改数据框名称?我现在使用您新添加的名称编辑了我的答案,另外我添加了另一个带有 data.table 的选项,我认为其中一个应该可以工作。
      【解决方案3】:

      你也可以使用基本的 R

      cbind(Dataset,data.frame(matrix(rep(Headers$y,each=nrow(Dataset)),nrow=nrow(Dataset))))
      

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 2022-06-29
        • 2018-12-27
        • 1970-01-01
        • 2020-09-11
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 2020-03-08
        相关资源
        最近更新 更多