【问题标题】:Replacing levels of multiple factors替换多个因子的水平
【发布时间】:2015-04-04 00:15:52
【问题描述】:

我需要在一个数据框中替换多个因素的水平,因此它们将全部统一。 例如,这些因素之一的水平:

> levels(workco[,5])
 [1] " "                              "1"                              "2"                             
 [4] "kóko"                          "kesätyö"                      "Kesätyö kokoaika"            
 [7] "koko"                           "kokop"                          "kokop."                        
[10] "Kokopäivä"                    "kokopäiväinen"                "Kokopäiväinen"               
[13] "kokopäiväinen / osa-aikainen" "kokopäivänen"                 "kokp"                          
[16] "kokp."                          "Kokp."                          "osa-aik"                       
[19] "Osa-aik / Kokopäiv."           "osa-aik."                       "Osa-aik."                      
[22] "osa-aikainen"                   "Osa-aikainen"                   "osa-aikainen/kokopäiväinen"  
[25] "Osa/kokoaikainen"               "Osap."                  

假设我有 12 列都是因子,它们具有不同的级别名称,指代相同的含义以不同的方式表达:从示例中可以看出,其中许多在级别名称中显示相同的字母:@987654323 @... 我想通过统一获得三个级别:kokoposakes。此外,以数字12 命名的级别应分别重新编码为kokoposa

到目前为止,我尝试过的事情都没有成功,恐怕是因为我的思维方式比实际更复杂:我尝试过使用adist() 函数和grep() 分别使用的循环,但我发现错误。 例如:

code <- c("kok","osa","ma","kes",1,2," ")
list.names <- c("1", "2", "3", "4", "5", "6","7","8","9","10","11","12")
mylist <- vector("list", length(list.names))
names(mylist) <- list.names
D <- mylist
index <- mylist

for (i in ncol(workco2)){                            
  D[[i]] <- adist(workco2[,i],code,ignore.case=TRUE)
  index[[i]] <- lapply(D[[i]],which.min)
  workco2[,i] <- data.frame(code[index[[i]]])
}

还有这个错误信息:

Error in code[index[[i]]] : invalid subscript type 'list'

你能告诉我你将如何解决它吗?可能比我想象的要简单得多 =/ 提前谢谢!

【问题讨论】:

  • Minimal reproducible example 和预期的输出。像"kokopäiväinen / osa-aikainen"这样的混合级别应该怎么办?
  • 抱歉 Roland,刚刚粘贴了错误信息。混合级别应编码为“osa”或“kes”以防出现,如果 osa/kes 同时显示则选择“kes”。
  • @Gina Zetkin。我们的回答对您有帮助吗?

标签: r rename r-factor


【解决方案1】:

我猜你需要 grep 和 replace 的组合。 这可能会加速具有相似音节(“ko”、“kok”)的级别变化。

数据示例

code <- as.factor(c("kok","osa","ma","kes", "koko", "osa-aikainen", "osa/kes"))

添加关卡

levels(code) <- c(levels(code), "kokop")

将所有包含“kok”的实例替换为“kokop”

new.code <- replace(code, (grep ("kok", code)), "kokop")

将所有包含“osa/kes”的实例替换为“kes”

new.code <- replace(code, (grep ("osa/kes", code)), "kes")

使用较短的字符串,例如。 “ko”,用相似的音节改变级别(“ko”,“kok”)

new.code <- replace(code, (grep ("ko", code)), "kokop")

【讨论】:

    【解决方案2】:

    我通常合并因子,如下例所示。 我对符合我的标准 (... %in% c(...)) 的级别进行子集化,并用新级别覆盖它们。

    set.seed(357)
    xy <- data.frame(name = sample(letters[1:4], size = 20, replace = TRUE), value = runif(20))
    xy$name
      [1] a a b a c b d c d d c c b a c a b d c b
      Levels: a b c d
    levels(xy$name)[levels(xy$name) %in% c("a", "b")] <- "a-b"
    levels(xy$name)[levels(xy$name) %in% c("c", "d")] <- "c-d"
    xy$name
     [1] a-b a-b a-b a-b c-d a-b c-d c-d c-d c-d c-d c-d a-b a-b c-d a-b a-b c-d c-d a-b
    Levels: a-b c-d
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      相关资源
      最近更新 更多