R 我有三个因素有一些共同的水平:如何改变所有因素中相同数字的相等水平?

R 我有三个因素有一些共同的水平:如何改变所有因素中相同数字的相等水平?,r,factors,levels,R,Factors,Levels,我已经找到了如何以一种简单的方式改变因子的水平。我的问题是我有三列(因子),它们有一些共同的层次。我需要确保我可以改变——一般来说,因为明年这个因素的水平将有一个不同的名称——相同的“新”水平的因素之间的平等水平。 例如: >数据数据[25:35,1:5] OBS POP IDPOP IDMOM IDDAD 25.25 MUR3 MUR3 BMXPotênciaRR M9056RR 26 MUR9 MUR9 BMXPotènciaRR M8221RR 27月27日18月18日BMXPotènci

我已经找到了如何以一种简单的方式改变因子的水平。我的问题是我有三列(因子),它们有一些共同的层次。我需要确保我可以改变——一般来说,因为明年这个因素的水平将有一个不同的名称——相同的“新”水平的因素之间的平等水平。 例如:

>数据数据[25:35,1:5]
OBS POP IDPOP IDMOM IDDAD
25.25 MUR3 MUR3 BMXPotênciaRR M9056RR
26 MUR9 MUR9 BMXPotènciaRR M8221RR
27月27日18月18日BMXPotènciaRR P98N71
28 28 MUR29 MUR29 BMXPotênciar征服
29 29 GENIT BMXPotênciaRR 0 0
30 30 GENIT NA5909RR 0 0
31 31 MUR25 MUR25 DM5958IPRO征服
32 MUR27 MUR27 TMG7062IPRO征服
33 33 GENIT DM5958IPRO 0 0
34 34 GENIT P98N71 0 0
35 35 MUR1 MUR1 BMXApoloRR M9056RR
>级别(数据$IDDAD)
[1] “0”“征服”“M8221RR”“M9056RR”“P98N71”
>级别(数据$IDMOM)
[1] “0”“BMXApoloRR”“BMXPotênciaRR”“DM5958IPRO”
“DM6563IPRO”
[6] “NA5909RR”“TMG7062IPRO”
>级别(数据$IDPOP)
[1] “BMXApoloRR”“BMXPotênciar”“征服”“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 b a
[1] “BMXPotênciaRR”“DM5958IPRO”“TMG7062IPRO”
>b
[1] "1" "2" "3"

由于我必须以一般方式编写代码,因此我不打算编写级别,而是通过“级别(…)”来捕获它们。

如果我们需要在多个列中更改公共
级别
,请使用
intersect
标识公共
级别

# columns of interest
nm1 <- c("IDDAD", "IDMOM", "IDPOP")
v1 <- Reduce(intersect, lapply(data[nm1], levels))
为列指定新的
级别

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

data[nm1]假设问题是如何将数据框中所有或指定因子列的级别设置为其级别的并集

假设我们有
DF
(如末尾的注释所示)和几个因子和非因子列


1)基R第一次计算
是.fac
作为逻辑向量,识别哪些列是因子。如果您想设置一些因子列,则设置“代码> >是.FAC< /COD>手动-IS.FAC可以是每列一个元素的逻辑向量,或者可以是要处理的列索引的整数向量,也可以是感兴趣的列名的字符向量。例如,如果我们只考虑FIR。我们可以设置的st两列
是。谢谢!它工作得很好!我从没想过会这样…它解决了我的问题。
# columns of interest
nm1 <- c("IDDAD", "IDMOM", "IDPOP")
v1 <- Reduce(intersect, lapply(data[nm1], levels))
v2 <- seq_along(v1)
data[nm1] <- lapply(data[nm1], function(x) {
                   levels(x)[levels(x) %in% v1] <- v2
                    x
                 })
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))
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
DF3 <- replace(DF, is.fac, lapply(DF[is.fac], as.character))
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)