gpt4 book ai didi

R根据另一个表中的变量列表保留和排序变量

转载 作者:行者123 更新时间:2023-12-04 09:25:36 27 4
gpt4 key购买 nike

这被认为是一项简单的任务,而且微不足道,但我无法让它发挥作用。我想创建一个新表,使用与另一个表相同的顺序。假设我的当前数据具有与过去数据相同的 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>

最佳答案

使用更方便setcolorder通过将 'new' 中的唯一列与 intersect 连接起来按该顺序输入列名

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)

关于R根据另一个表中的变量列表保留和排序变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63023455/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com