根据另一个数据框中指定的排名对列重新排序

时间:2014-08-20 17:44:04

标签: r

我有两个数据框。第一个数据框有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

2 个答案:

答案 0 :(得分:1)

如果dat1dat2firstsecond数据集

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