Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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 - Fatal编程技术网

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

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

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

如果
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