根据colnames列表排序

时间:2013-07-26 09:40:45

标签: r sorting dataframe

我有一个第一个看起来像这样的数据框:

  

DF1

          a    d    c    b
Name1     1    1   -1   -1      
Name2    -1    2   -3    1     
Name3     1    2   -1    0   
Name4     9    0    1   -10    

和第二个包含DF1列名的data.frame。换句话说,它看起来像:

  

DF2
      一个
      d
      ç
     B'/ P>

我想按顺序(按递减顺序)命令DF1:首先DF2 == a,然后根据DF2 == c,然后根据DF2 == d依此类推。 在实际情况中,DF2由大约1000个元素以及DF1的列组成,DF2的每个元素将与DF1列匹配。 所需的输出将是:

为DF2 [1,]

排序后
  

[[1]]

          a    d    c    b
Name1     9    0   -1   -10      
Name2     1    1   -3    1     
Name3     1    2   -1    0   
Name4    -1    2   -3    1    

为DF2 [2,]

排序后
  

[[2]]

          a    d    c    b
Name1    -1    2   -3    1     
Name2     1    2   -1    0     
Name3     1    1   -1   -1   
Name4     9    0    1  -10  

等等。

2 个答案:

答案 0 :(得分:2)

在澄清问题后编辑:

DF1 <- read.table(text="a    d    c    b
Name1     1    1   -1   -1      
Name2    -1    2   -3    1     
Name3     1    2   -1    0   
Name4     9    0    1   -10 ", header=TRUE)

DF2 <- data.frame(cols=c("a", "c", "d", "b"))


lapply(as.list(DF2$cols), 
       function(x,df) df[order(df[,x], decreasing=TRUE),], 
       df=DF1)

# [[1]]
#        a d  c   b
# Name4  9 0  1 -10
# Name1  1 1 -1  -1
# Name3  1 2 -1   0
# Name2 -1 2 -3   1
# 
# [[2]]
#        a d  c   b
# Name4  9 0  1 -10
# Name1  1 1 -1  -1
# Name3  1 2 -1   0
# Name2 -1 2 -3   1
# 
# [[3]]
#        a d  c   b
# Name2 -1 2 -3   1
# Name3  1 2 -1   0
# Name1  1 1 -1  -1
# Name4  9 0  1 -10
# 
# [[4]]
#        a d  c   b
# Name2 -1 2 -3   1
# Name3  1 2 -1   0
# Name1  1 1 -1  -1
# Name4  9 0  1 -10

答案 1 :(得分:0)

我认为你会这样:

DF[Reduce(order,DF),]
       a d  c   b
Name2 -1 2 -3   1
Name1  1 1 -1  -1
Name3  1 2 -1   0
Name4  9 0  1 -10