У меня есть три фактора с некоторыми общими уровнями: как изменить одинаковые уровни для одинаковых чисел во всех факторах? - PullRequest
0 голосов
/ 02 сентября 2018

Я уже нашел, как легко изменить уровни фактора. Моя проблема в том, что у меня есть три столбца (фактора), и у них есть общие уровни. Мне нужно быть уверенным, что я могу измениться - в общем, потому что в следующем году уровни этого фактора будут иметь другое название - равные уровни среди факторов для того же самого «нового» уровня. Пример:

> data<-read.table(head=T,"F2_SULMaturação_Conjunta.txt")
> data[25:35,1:5]
   OBS   POP         IDPOP         IDMOM     IDDAD
25  25  MUR3          MUR3 BMXPotênciaRR   M9056RR
26  26  MUR9          MUR9 BMXPotênciaRR   M8221RR
27  27 MUR18         MUR18 BMXPotênciaRR    P98N71
28  28 MUR29         MUR29 BMXPotênciaRR CONQUISTA
29  29 GENIT BMXPotênciaRR             0         0
30  30 GENIT      NA5909RR             0         0
31  31 MUR25         MUR25    DM5958IPRO CONQUISTA
32  32 MUR27         MUR27   TMG7062IPRO CONQUISTA
33  33 GENIT    DM5958IPRO             0         0
34  34 GENIT        P98N71             0         0
35  35  MUR1          MUR1    BMXApoloRR   M9056RR
> levels(data$IDDAD)
[1] "0"         "CONQUISTA" "M8221RR"   "M9056RR"   "P98N71"   
> levels(data$IDMOM)
[1] "0"             "BMXApoloRR"    "BMXPotênciaRR" "DM5958IPRO"    
"DM6563IPRO"   
[6] "NA5909RR"      "TMG7062IPRO"  
> levels(data$IDPOP)
[1] "BMXApoloRR"    "BMXPotênciaRR" "CONQUISTA"     "DM5958IPRO"            
"DM6563IPRO"   
[6] "M8221RR"       "M9056RR"       "MUR1"          "MUR13"         "MUR14"        
[11] "MUR15"         "MUR16"         "MUR17"         "MUR18"         "MUR2"         
[16] "MUR24"         "MUR25"         "MUR26"         "MUR27"         "MUR28"        
[21] "MUR29"         "MUR3"          "MUR7"          "MUR8"          "MUR9"         
[26] "NA5909RR"      "P98N71"        "TMG7062IPRO"  

Обратите внимание, что некоторые уровни "IDPOP", "IDMOM" и "IDDAD" являются одинаковыми, то есть "BMXPotênciaRR". Я ищу код, возможно, который позволит мне установить два вектора с соответствующими «новыми уровнями» в одной строке и внести это изменение в пакетном режиме. Пример:

> a<-c("BMXPotênciaRR","DM5958IPRO", "TMG7062IPRO")
> b<-c("1","2","3")
> a
[1] "BMXPotênciaRR" "DM5958IPRO"    "TMG7062IPRO"  
> b
[1] "1" "2" "3"

Поскольку я должен писать код в общих чертах, я не собираюсь писать уровни, а собираю их как "уровни (...)".

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

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

Предположим, у нас есть DF (показано в конце в примечании) с несколькими факторными и нефакторными столбцами.

1) База R Сначала вычислите is.fac, чтобы он представлял собой логический вектор, определяющий, какие столбцы являются факторами. (Если вы хотите установить некоторые из столбцов фактора, тогда установите is.fac вручную - is.fac может быть логическим вектором с одним элементом на столбец или целочисленным вектором индексов столбцов, которые должны быть обработаны, или это может быть символьный вектор интересующих имен столбцов. Например, если мы хотим рассмотреть только первые два столбца, мы можем установить is.fac <- 1:2 или is.fac <- c("A", "B").)

Затем используйте Reduce, чтобы получить объединение их уровней, levs. Если порядок уровней имеет значение, тогда сортируйте levs, скажем.

Наконец установите уровни каждого фактора на levs.

is.fac <- sapply(DF, is.factor)
levs <- Reduce(union, lapply(DF[is.fac], levels), init = NULL)
fix_levs <- function(x, levs) factor(as.character(x), levels = levs)
DF2 <- replace(DF, is.fac, lapply(DF[is.fac], fix_levs, levs))

Мы видим, что уровни столбцов факторов одинаковы. Например, обратите внимание, что «c» появляется в DF как 3-й уровень в DF$A, второй уровень в DF$B и первый уровень в DF$C, но «c» постоянно отображается как третий уровень во всех трех столбцы в DF2.

DF$A
## [1] a b c
## Levels: a b c
DF$B
## [1] b c d
## Levels: b c d
DF$C
## [1] c d e
## Levels: c d e

DF2$A
## [1] a b c
## Levels: a b c d e
DF2$B
## [1] b c d
## Levels: a b c d e
DF2$C
## [1] c d e
## Levels: a b c d e

2) символ Другая возможность - просто использовать символьные столбцы. Тогда нам не нужно беспокоиться о том, одинаковые ли уровни или нет. Используя is.fac сверху:

DF3 <- replace(DF, is.fac, lapply(DF[is.fac], as.character))

3) forcats Для этой цели в пакете forcats есть fct_unify. Используя is.fac сверху:

library(forcats)
DF4 <- replace(DF, is.fac, fct_unify(DF[is.fac]))

Примечание

Мы использовали следующий тестовый фрейм данных:

DF <- data.frame(A = letters[1:3], B = letters[2:4], C = letters[3:5], D = 1:3)
0 голосов
/ 02 сентября 2018

Если нам нужно изменить общее levels в нескольких столбцах, отождествите общее levels с intersect

# columns of interest
nm1 <- c("IDDAD", "IDMOM", "IDPOP")
v1 <- Reduce(intersect, lapply(data[nm1], levels))

Новые уровни для vector из levels (могут быть пользовательскими levels)

v2 <- seq_along(v1)

Назначить новый levels столбцам

data[nm1] <- lapply(data[nm1], function(x) {
                   levels(x)[levels(x) %in% v1] <- v2
                    x
                 })
...