Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据其他文件行对数据表中的所有列重新排序_R_Data.table - Fatal编程技术网

R 根据其他文件行对数据表中的所有列重新排序

R 根据其他文件行对数据表中的所有列重新排序,r,data.table,R,Data.table,我有1个data.table(dt1),其中有些ID按照我的条件排序 1. id10 2. id7757 3. id75340 4. id999 5. id5498 第二个data.table(dt2),第一个data.table的id作为列名 SOURCE id7757 id8948 id5498 id999 id10 id75340 source1 32 87 643 8676 34 10

我有1个
data.table(dt1)
,其中有些ID按照我的条件排序

1. id10
2. id7757
3. id75340
4. id999
5. id5498
第二个
data.table(dt2)
,第一个
data.table
的id作为列名

SOURCE    id7757    id8948    id5498    id999     id10    id75340
source1   32        87        643       8676      34      10
source2   65        32        876       9457      8       777
source3   64        666       99        222       66      222
如何根据第一个
data.table
的顺序缩短第二个
data.table
的列?这意味着第一个位置上的id应该是第一列、第二个位置~第二列等

输出文件应如下所示:

SOURCE    id10    id7757    id75340    id999    id5498
source1   34      32        10         8676     643
source2   8       65        777        9476     32
source3   66      64        222        222      666
如何在R中实现这一点?

基本/dplyr方法:

new_order <- sapply(dt1$V2, grep, colnames(dt2)) %>% unlist()

select(dt2, SOURCE, new_order)

SOURCE id10 id7757 id75340 id999 id5498
1: source1   34     32      10  8676    643
2: source2    8     65     777  9457    876
3: source3   66     64     222   222     99
新订单%unlist()
选择(dt2、源、新订单)
来源id10 id7757 id75340 id999 id5498
1:来源1 34 32 10 8676 643
2:来源28657779457876
3:来源36642222299

这样做其实很简单。结果证明我的数据集有问题

所以首先清理您的数据集

解决办法如下:

all.sorted <- read.table("sorted.txt", header=T, sep=' ', na.strings="n/a")

sorted.ids <- unlist(all.sorted$ID)
sorted.ids.sanitized <- make.names(sorted.ids)

sorted.variants <- sorted.ids.sanitized # this step was just to check if all is good and keep a copy of the original
sorted.variants <- as.character(sorted.variants)

new.order <- dt2[, sorted.variants]

all.sorted
dplyr::select(dt2,dt1$ID)
?@Nathan Day
错误:位置必须介于0和n之间
是否要通过保持列本身的顺序来对列名进行排序?你确定这是明智的吗?@David Arenburg我不认为示例中的顺序相同。我仔细地匹配了两个示例中的精确值,并在31231列中添加了“虚拟”值,因为它不是第一个示例中的值。无论哪种方式,您都可以执行
setcolorder(DT2,c(1,(match(DT1[,ID],as.integer(names(DT2)[-1])+1))
。这将在适当位置修改DT2(您的第二个
数据表)。另外,在R中,将列名作为整数是一种不好的做法,因为它们很难处理,而且它们看起来只像整数,而实际上是字符。如果您不想获得每行上的ID,而不是
df1$ID
,您将如何执行相同的过程?因为现在,ID已排序
ID1您是说未排序的
df1$ID
,您想发布一个带有具体示例和理想输出的问题吗?