R 根据其他文件行对数据表中的所有列重新排序
我有1个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
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.sorteddplyr::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
,您想发布一个带有具体示例和理想输出的问题吗?