R 根据另一个数据框中指定的排名对列重新排序
我有两个数据帧。第一个数据帧有100列。我想根据第二个数据框中指定的排名重新排列第3列到第100列。例如,如果第一个数据帧是R 根据另一个数据框中指定的排名对列重新排序,r,R,我有两个数据帧。第一个数据帧有100列。我想根据第二个数据框中指定的排名重新排列第3列到第100列。例如,如果第一个数据帧是 Product Attribute flowers stones house pool A large 100 200 300 500 B medium 200 500 400 600 C small
Product Attribute flowers stones house pool
A large 100 200 300 500
B medium 200 500 400 600
C small 300 400 300 200
第二个数据集是
Name Rank
flowers 3
stones 4
house 1
pool 2
然后在所需步骤之后,新数据集应该如下所示
Product Attribute house pool flowers stones
A large 300 500 100 200
B medium 400 600 200 500
C small 300 200 300 400
根据下面的答案,我尝试了以下方法:
Product=c("A","B","C")
flowers=c(100,200,300)
stones=c(200,500,400)
house=c(300,400,500)
pool=c(500,600,200)
dat1=data.frame(Product,flowers,stones,house,pool)
Name=c("flowers","stones","house","pool")
Rank=c(3,4,1,2)
dat2=data.frame(Name,Rank)
indx <- c(names(dat1)[1:1],with(dat2, Name[Rank]))
dat1[,indx]
如果
dat1
和dat2
是第一个
和第二个
数据集
indx <- c(names(dat1)[1],as.character(with(dat2, Name[Rank])))
dat1[,indx]
dat2
中的Name
是因数),您可以使用As.character
将其转换为`字符类'名称(dat1)[1]
是产品
。将其连接到上一个结果,将按指定顺序显示dat1
中的列名称。使用此作为名称索引从dat1
- 怎么样
dat1[c(names(dat1)[1], as.character(dat2[order(dat2$Rank),][, "Name"]))]
# Product house pool flowers stones
# 1 A 300 500 100 200
# 2 B 400 600 200 500
# 3 C 500 200 300 400
谢谢,但它不起作用。。。第一行可以正常运行。第二个有这样的错误消息“error in
[.data.frame
(dat1,indx):未定义的列被选中”。知道为什么吗?谢谢!甚至输出“indx”第一行的内容对我来说也没什么意义。你能告诉我吗?@user3698033,试试看now@user3698033感谢您提供了一个可复制的示例。当我阅读数据时,我使用了stringsAsFactors=FALSE
,因此字符列仍保留为character
类。在新数据集中dat2
,列Name
是一个因素。现在您的新dat1
没有属性
列。它可以工作。但是如何保留dat1中的第一列(“产品”)呢?@user3698033,请取消接受。akrun的答案是正确的。请参阅我对他的答案的编辑
[1] house pool flowers stones
Levels: flowers house pool stones
dat1[c(names(dat1)[1], as.character(dat2[order(dat2$Rank),][, "Name"]))]
# Product house pool flowers stones
# 1 A 300 500 100 200
# 2 B 400 600 200 500
# 3 C 500 200 300 400