我有两个数据框。第一个数据框有100列。我想根据第二个数据框中指定的排名重新排序第3到第100列。例如,如果第一个数据帧是
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]
但最后一行没有运行有这样的错误信息:
Error in `[.data.frame`(dat1, , indx) : undefined columns selected
答案 0 :(得分:1)
如果dat1
和dat2
是first
和second
数据集
indx <- c(names(dat1)[1],as.character(with(dat2, Name[Rank])))
dat1[,indx]
dat2$Rank
提供了数字索引[1] 3 4 1 2
当我们使用dat2$Name[dat2$Rank]
或with(dat2, Name[Rank])
时,它会根据Name
列中指定的顺序重新排列Rank
列。即。
[1] house pool flowers stones
Levels: flowers house pool stones
由于这是一个因素(因为Name
中的dat2
是因子),您可以使用as.character
将其转换为`字符类
names(dat1)[1]
是Product
。将此连接到上一个结果会以指定的顺序为您提供dat1
中列的名称。使用此作为名称索引来获取dat1
答案 1 :(得分:1)
怎么样
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