【问题标题】:Sort dataframe with multiple columns for multiple years对具有多列的数据框进行多年排序
【发布时间】:2016-05-03 12:55:22
【问题描述】:

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

我说明如下:

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

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

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,但对于我正在寻找的东西来说仍然是不同的。 非常感谢您在这方面的帮助。

【问题讨论】:

  • 所需的输出可能会导致每列的class 出现问题。
  • @akrun 那么,每列可能有不同的类?
  • 在您想要的输出中,您在每一列中混合类,最终将成为一个字符列
  • @DavidArenburg okie 现在我明白这是否会成为更大的问题,因为接下来我必须形成十分位数。
  • 只要您有字母字符,您就无法将其转换为数字类。两者中的哪一个是您想要的输出?不清楚

标签: r sorting


【解决方案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 

我们可以提取names或'lst'中的元素

  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)))

【讨论】:

  • 能否请您详细说明这段代码,这样,您对我的不便就少了
  • 我得到了一个非常奇怪的输出,它现在是一个包含 15 个元素的矩阵。
  • @Aquarius 根据你的例子,它对我来说很好。
  • 没错,我会再看一遍。
猜你喜欢
  • 2010-11-20
  • 2020-02-29
  • 2019-10-24
  • 1970-01-01
  • 2013-06-23
  • 2020-11-14
  • 2021-08-29
相关资源
最近更新 更多