我有一个包含多列的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,但仍然与我正在寻找的不同。 非常感谢您在这方面的帮助。
答案 0 :(得分:1)
我们可以将apply
与MARGIN=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"
如果我们需要值以及names
,list
方法会更合适,因为它不会在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)))