2014-12-10 3 views
4

Речь идет о упорядочении имен столбцов, содержащих как числа, так и текст. У меня есть dataframe, который был результатом dcast и имеет 200 строк. У меня проблема с заказом.R: Заменить столбцы из dcast-вывода численно вместо лексикографически

Имен столбцов в следующем формате:

names(DF) <- c('Testname1.1', 'Testname1.100','Testname1.11','Testname1.2',...,Testname2.99) 

Edit: Я хотел бы, чтобы столбцы заказанных:

names(DF) <- c('Testname1.1, Testname1.2,Testname1.3,...Testname1.100,Testname2.1,...Testname 2.100) 

оригинальный вход имеет столбец, который определяет день, но он не используется, когда я «бросаю» данные. Есть ли способ указать функцию «dcast» для численного сопоставления имен столбцов?

Что было бы самым простым способом получить упорядоченные столбцы, как мне нужно в R?

Большое спасибо!

ответ

3

Я думаю, что вам нужно разделить колонку, прежде чем вы можете использовать его, чтобы заказать фрейм данных: данные тестирования

library("reshape2") ## for colsplit() 
library("gtools") 

конструктива:

dat <- data.frame(matrix(1:25,5)) 
names(dat) <- c('Testname1.1', 'Testname1.100', 
    'Testname1.11','Testname1.2','Testname2.99') 

Сплит и заказ:

cdat <- colsplit(names(dat),"\\.",c("name","num")) 
dat[,order(mixedorder(cdat$name),cdat$num)] 

## Testname1.1 Testname1.2 Testname1.11 Testname1.100 Testname2.99 
## 1   1   16   11    6   21 
## 2   2   17   12    7   22 
## 3   3   18   13    8   23 
## 4   4   19   14    9   24 
## 5   5   20   15   10   25 

mixedorder() выше (заимствовано из @ BondedDust Ответим) не является необходимым для этого примера, но было бы необходимо, если первый (Testnamexx) компонент имел более 9 элементов, так что Testname1, Testname2 и Testname10 придет в надлежащий порядок.

+0

(+1) Я думал то же самое –

+0

Еще нужно добавить 'as.numeric' вокруг второго элемента, так как лексикографическая сортировка сделает« 100 »<« 2 » –

+0

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

1

Один из способов будет:

library(gtools) #use gtools library 
library(NCmisc) #use NCmisc library for pad.left() 

myvec <- c('Testname1.1', 'Testname1.100','Testname1.11','Testname1.2','Testname2.99') #construct your vector 

myvec[mixedorder( paste(substring(myvec,1,9), pad.left(substring(myvec,11,100),'0') , sep='') ) ] 

[1] "Testname1.1" "Testname1.2" "Testname1.11" "Testname1.100" "Testname2.99" 
+0

Я одобрен просто для упоминания 'gtools :: mixedsort', но если он работает по желанию, ему не нужно будет использовать substr. –

+0

Хм, да, ты прав. Я посмотрю и исправлю как можно скорее. Благодарю. mixedorder мне очень помог. – LyzandeR

+0

С этим ясным умом сегодня утром это тоже выглядит как решение. Спасибо, что заметили мою ошибку ранее. – LyzandeR

3

Смешанные и смешанные функции pkg: gtools иногда делает то, что желательно, но в этом случае я думаю, что разделитель периодов перепутал вещи, потому что он является частью числовых значений. Но явно предполагалось, что это разделитель, а не десятичная точка. Попробуйте

nvec <- c('Testname1.1', 'Testname1.100', 'Testname1.11', 'Testname1.2', 'Testname2.99') 
#------------ 
> require(gtools) 
Loading required package: gtools 

Attaching package: ‘gtools’ 

The following objects are masked from ‘package:boot’: 

    inv.logit, logit 
#------------ 
myvec <- nvec[order(mixedorder(sapply(strsplit(nvec, "\\."), "[[", 1)), 
        as.numeric(sapply(strsplit(nvec, "\\."), "[[", 2)) ) 
       ] 
Смежные вопросы