【问题标题】:R keep and order variables based on variable list form other tableR根据另一个表中的变量列表保留和排序变量
【发布时间】:2020-07-21 21:35:48
【问题描述】:

这假设是一项简单而微不足道的任务,但我无法让它发挥作用。我想创建一个新表,使用与另一个表相同的顺序。假设我有与过去数据相同的 5 个变量但顺序不同的当前数据。我希望当前数据具有相同的结构。我尝试使用旧数据中的列名列表并使用 R data.table 来排列变量,但是正如您从示例中看到的那样,新数据可能是列表/字符或带有空数据的 data.table。有什么建议么?谢谢!

> str(new)
Classes ‘data.table’ and 'data.frame':  2 obs. of  7 variables:
 $ id: int  1 2
 $ x1: int  0 1
 $ x4: int  1 0
 $ x5: int  1 0
 $ x2: int  0 0
 $ x3: int  1 0
 $ x6: int  0 1
 - attr(*, ".internal.selfref")=<externalptr> 

> str(old)
Classes ‘data.table’ and 'data.frame':  2 obs. of  6 variables:
 $ id: int  1 2
 $ x1: int  1 0
 $ x2: int  1 0
 $ x3: int  1 0
 $ x4: int  0 0
 $ x5: int  1 0
 - attr(*, ".internal.selfref")=<externalptr> 

 namelist <- list(names(old))
newlist <- new[,c(namelist)] # using data.table to order the variables
 newlist <- new[,unlist(namelist)] # newlist is character instead of data.table

newlist <- new[,c(namelist)] # data.table but not expected data.
 class(newlist)
[1] "data.table" "data.frame"
> str(newlist)
Classes ‘data.table’ and 'data.frame':  6 obs. of  1 variable:
 $ V1: chr  "id" "x1" "x2" "x3" ...
 - attr(*, ".internal.selfref")=<externalptr> 

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    通过将“new”中的唯一列与intersecting 列名按该顺序连接起来,更容易使用setcolorder

    nm1 <- setdiff(names(new), names(old))
    nm2 <- intersect(names(new), names(old))
    setcolorder(new,  gtools::mixedsort(c(nm1, nm2)))
    new
    #   id x1 x2 x3 x4 x5 x6
    #1:  1  0  0  1  1  1  0
    #2:  2  1  0  0  0  0  1
    

    或者另一种选择是

    setcolorder(new, names(rbindlist(list(old, new), fill = TRUE)))
    

    union

    setcolorder(new, setdiff(union(names(old), names(new)), 
                     setdiff(names(old), names(new))))
    

    数据

    new <- data.table(id = 1:2, x1 = 0:1, x4 = 1:0, x5 = 1:0, x2 = 0, x3 = 1:0, x6 = 0:1) 
    old <- data.table(id = 1:2, x1 = 1:0, x2 = 1:0, x3 = 1:0, x4 = 0, x5 = 1:0)
    

    【讨论】:

    • 谢谢,这很有帮助和鼓舞人心!一件小事是在我的真实数据问题中没有遵循旧的数据变量顺序。我会玩。
    • @ponyhd 我显示的顺序是首先它将具有“新”唯一的列,然后是按旧顺序排列的新旧列。
    • @ponyhd 我想我理解你的问题。更新了帖子。
    【解决方案2】:

    您可以使用old 的列名和new 数据框的子集,以与old 相同的顺序获取数据。

    library(data.table)
    
    cols <- names(old)
    new[, ..cols]
    

    【讨论】:

      【解决方案3】:

      我结合并调整了@akrun 和@Ronak Shah 的解决方案并解决了这个问题。谢谢你们两个!!代码如下:

      new <- data.table(id = 1:2, x1 = 0:1, x4 = 1:0, x5 = 1:0, x2 = 0, x3 = 1:0, x6 = 0:1) 
      old <- data.table(id = 1:2, x1 = 1:0, x2 = 1:0, x3 = 1:0, x4 = 0, x5 = 1:0)
      
      oldord <- names(old) # find old variable list
      newvar <- setdiff(names(new), names(old)) #find additional variables
      neword <- cbind(new[,..oldord],new[,..newvar]) #subset and combine old and new variables
      neword 
      > neword
         id x1 x2 x3 x4 x5 x6
      1:  1  0  0  1  1  1  0
      2:  2  1  0  0  0  0  1
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-15
        • 2012-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-01
        相关资源
        最近更新 更多