多年对具有多列的数据框进行排序

时间:2016-01-26 19:54:58

标签: r sorting

我有一个包含多列的data.frame,第一列是Year。我希望每年按降序对数据框进行排序。我有十五年的数据,然后有超过3000列。

我说明如下:

Year    A   B   C   D
2000    2   3   4   NA
2001    3   4   NA  1

所需的输出,我的数据框也有NA s但我无法删除它们。

Year    C   B   A
2000    4   3   2
Year    B   A   D
2001    4   3   1

这个版本也是如此

 Year           
    2000    C   B   A
    2001    B   A   D

我编写了此代码的脚本

Asc <-order(df[-1], decreasing=True)

但我无法获得所需的输出。我已经提到了in R sort row data in ascending order,但仍然与我正在寻找的不同。 非常感谢您在这方面的帮助。

1 个答案:

答案 0 :(得分:1)

我们可以将applyMARGIN=1一起使用。我们使用apply遍历数据集的行(不包括第一列),获取非NA元素的索引('i1'),按顺序排列非NA值('i2'),并使用这是重新排列数据集的列名称。

m1 <- t(apply(df1[-1], 1, function(x) {
         i1 <- !is.na(x)
         i2 <- order(-x[i1])
         names(df1)[-1][i1][i2]}))
m1
#    [,1] [,2] [,3]
#[1,] "C"  "B"  "A" 
#[2,] "B"  "A"  "D" 

如果我们需要值以及nameslist方法会更合适,因为它不会在class

中产生任何问题
 lst <- apply(df1[-1], 1, function(x){
            i1 <- !is.na(x)
           list(sort(x[i1],decreasing=TRUE))})
 lst
 #[[1]]
 #[[1]][[1]]
 #C B A 
 #4 3 2 


 #[[2]]
 #[[2]][[1]]
 #B A D 
 #4 3 1 

我们可以从'lst'

中提取names或元素
  do.call(rbind, do.call(`c`,rapply(lst, names, 
             how='list')))
  #   [,1] [,2] [,3]
  #[1,] "C"  "B"  "A" 
  #[2,] "B"  "A"  "D" 

或者

  t(sapply(do.call(c, lst), names))

,值为

  t(simplify2array(do.call(c, lst)))