2015-07-15 2 views
2

Как отсортировать данные с одним столбцом?Порядок использования R в одном кадре данных столбца

Я использую следующие:

> set.seed(456) 
> df1 <- data.frame(col1 = runif(10)) 
> class(df1) 
[1] "data.frame" 
> df1 <- df1[order(df1$col1),] 
> class(df1) 
[1] "numeric" 

Однако если добавить пустые вещи колонки работают отлично:

> set.seed(456) 
> df1 <- data.frame(col1 = runif(10)) 
> df1$dummy <- NA 
> class(df1) 
[1] "data.frame" 
> df1 <- df1[order(df1$col1),] 
> class(df1) 
[1] "data.frame" 
> df1 
     col1 dummy 
7 0.08243274 NA 
1 0.08955160 NA 
2 0.21051232 NA 
9 0.23750327 NA 
8 0.28552695 NA 
6 0.33195997 NA 
10 0.38523617 NA 
3 0.73295527 NA 
5 0.78839789 NA 
4 0.85213354 NA 

Есть ли лучший способ сделать это?

+0

Возможный дубликат http://stackoverflow.com/questions/13156448/ how-can-i-sort-a-data-frame-with-only-one-column-without-lose-rownames/13156498 # 13156498 или http://stackoverflow.com/questions/6894246/how-to-sort- а-данные кадр-в-г/6894362 # 6894362 – Henrik

ответ

3

Вы можете добавить drop=FALSE, и он будет работать с большинством случаев. Значение по умолчанию для [ является drop=TRUE

df1[order(df1$col1),, drop=FALSE] 

На странице справки для? `[`, аргументы по умолчанию можно найти в «Использование»

x[i, j, ... , drop = TRUE] 

и описание для drop как

drop: для матриц и массивов. Если «ИСТИНА», результат принуждается к минимально возможному размеру (см. Примеры). Это только работает для извлечения элементов, а не для замены. См. «drop» для получения дополнительной информации.

0

Вы также можете использовать dplyr.

library(dplyr) 
df1 <- arrange(df1, col1) 
class(df1) 
[1] "data.frame" 
2

С data.table пакета, вам не нужен drop=FALSE:

library(data.table) 
setorder(setDT(df1), col1) 

дает:

> df1 
      col1 
1: 0.08243274 
2: 0.08955160 
3: 0.21051232 
4: 0.23750327 
5: 0.28552695 
6: 0.33195997 
7: 0.38523617 
8: 0.73295527 
9: 0.78839789 
10: 0.85213354 

В data.table v.1.9.5 + вы можете сделать это только с :

library(data.table) # v 1.9.5+ 
setorder(df1, col1) 

дает:

> df1 
     col1 
7 0.08243274 
1 0.08955160 
2 0.21051232 
9 0.23750327 
8 0.28552695 
6 0.33195997 
10 0.38523617 
3 0.73295527 
5 0.78839789 
4 0.85213354 
0

Я бы рекомендовал разделить операцию сортировки для оптимизации ресурсов и читаемость кода:

> positions <- order(df$col1) 
# if you want to create a rank: positions <- order(df$col1, decreasing = TRUE) 
# and then apply the order without modifying the dataframe 
> sorted_df <- df[positions,] 
Смежные вопросы