【问题标题】:I have three factors with some levels in common: how to change equal levels for the same numbers in all factors?我有三个具有一些共同水平的因素:如何改变所有因素中相同数字的相同水平?
【发布时间】:2019-02-07 20:36:03
【问题描述】:

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

> 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"

由于我必须以通用方式编写代码,因此我不打算编写关卡,而是通过“levels(...)”捕获它们。

【问题讨论】:

    标签: r factors levels


    【解决方案1】:

    如果我们需要在多个列中更改共同的levels,请将共同的levels标识为intersect

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

    vectorlevels 的新级别(可以自定义 levels

    v2 <- seq_along(v1)
    

    将新的levels 分配给列

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

    【讨论】:

      【解决方案2】:

      假设问题是如何将数据框中所有或指定因子列的水平设置为它们水平的并集。

      假设我们有DF(在最后的注释中显示)有几个因子和非因子列。

      1) Base R 首先计算is.fac 是一个逻辑向量,标识哪些列是因子。 (如果你想设置一些因子列,那么手动设置is.fac——is.fac 可以是一个逻辑向量,每列一个元素,也可以是要处理的列索引的整数向量,或者它可以是感兴趣的列名的字符向量。例如,如果我们只想考虑前两列,我们可以设置is.fac &lt;- 1:2is.fac &lt;- 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 中作为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)
      

      【讨论】:

      • 谢谢!它工作得很好!我从来不这么认为......它解决了我的问题。
      猜你喜欢
      • 2021-05-28
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-15
      • 2019-05-24
      • 2021-02-21
      • 1970-01-01
      • 2014-09-08
      相关资源
      最近更新 更多