2016-01-26 4 views
0

У меня есть data.frame с несколькими столбцами, а первый столбец - Year. Я хочу сортировать свой фрейм данных в порядке убывания на каждый год. У меня есть пятнадцать лет данных, а затем более 3000 столбцов.Сортировка данных с несколькими столбцами в течение нескольких лет

я проиллюстрировать следующим образом:

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

Желаемая выход, мой кадр данных имеет NA с как хорошо, но я не могу удалить их.

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

И это Verion а

Year   
    2000 C B A 
    2001 B A D 

Я сценарий этого кода

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

Но я не могу получить мой желаемый результат. Я упомянул in R sort row data in ascending order, но все же его разные для того, что я ищу. Поблагодарите вашу помощь в этом отношении.

+1

Нужный выход может создать проблемы с 'class' каждого столбца. – akrun

+0

@akrun Итак, у каждого столбца может быть разный класс? – Aquarius

+1

В вашем желаемом выходе вы смешиваете классы внутри каждого столбца, который в конечном итоге будет столбцом символов –

ответ

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 

Мы можем извлечь в 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))) 
+0

не могли бы вы выполнить этот код, так что у вас есть меньше неудобств у меня – Aquarius

+0

У меня очень странный вывод его матрицы теперь с 15 элементами. – Aquarius

+0

@Aquarius Основываясь на вашем примере, он отлично работает для меня. – akrun

Смежные вопросы