Функция paste() и уровни упорядочения переменных

У меня есть два столбца в следующем фрейме данных, и каждый столбец имеет уровни в соответствии с определенным порядком:

head(x1)
  soa congruency
1 200          9
2 102          2
3  68          1
4  68          9
5  34          9
6  68          9

head(levels(x1$soa))
[1] "34"  "68"  "102" "200"

head(levels(x1$congruency))
[1] "1" "2" "9

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

"34_1" "34_2" "34_9" "68_1" "68_2" "68_9" и т.д....

Однако, если я сделаю следующее:

x2 <- paste(x1$soa, x1$congruency, sep = "_")

уровни, которые я получаю:

x2 <- factor(x2)

class(x2)
[1] "factor"

levels(x2)
[1] "102_1" "102_2" "102_9" "200_1" "200_2" "200_9" "34_1"  "34_2"  "34_9" 
[10] "68_1"  "68_2"  "68_9" 

Я знаю, что могу изменить порядок уровней после вставки столбцов. Однако я хочу иметь возможность упорядочивать столбцы таким образом, чтобы после их вставки мне не нужно было менять порядок уровней. Есть ли способ, которым я могу это сделать? Например, я попытался упорядочить x1 с помощью функции order() (и я сделал это правильно), а затем вставил два столбца, но все равно получил тот же порядок уровней, который не тот порядок, который мне нужен.

Любая помощь будет оценена,

Айяла


person ayalaall    schedule 29.10.2014    source источник


Ответы (3)


Вы можете попробовать interaction:

interaction(x1$soa, x1$congruency, sep=  "_", lex.order = TRUE)
## [1] 200_9 102_2 68_1  68_9  34_9  68_9 
## Levels: 34_1 34_2 34_9 68_1 68_2 68_9 102_1 102_2 102_9 200_1 200_2 200_9
person nicola    schedule 29.10.2014
comment
Большое спасибо! Я воспользуюсь этим вариантом, так как он подходит мне лучше всего! Еще раз спасибо! - person ayalaall; 30.10.2014

Вы можете попробовать:

 library(gtools)
 with(x1, factor(paste(soa, congruency, sep="_"),
     levels=mixedsort(unique(paste(soa, congruency, sep="_")))))
 #[1] 200_9 102_2 68_1  68_9  34_9  68_9 
 #Levels: 34_9 68_1 68_9 102_2 200_9

данные

 x1 <- structure(list(soa = structure(c(4L, 3L, 2L, 2L, 1L, 2L), .Label = c("34", 
"68", "102", "200"), class = "factor"), congruency = structure(c(3L, 
2L, 1L, 3L, 3L, 3L), .Label = c("1", "2", "9"), class = "factor")), .Names = c("soa", 
"congruency"), row.names = c("1", "2", "3", "4", "5", "6"), class = "data.frame")
person akrun    schedule 29.10.2014

Все еще используя функции вставки и базы, вы можете попробовать:

x2<-paste(x1$soa,x1$congruency,sep="_")`
x2<-factor(x2,levels=paste(rep(levels(x1$soa),e=nlevels(x1$congruency)),levels(x1$congruency),sep="_"))
person Cath    schedule 29.10.2014