取代多种因素的水平

问题描述 投票:1回答:2

我需要在一个数据框中替换多个因子的级别,因此它们将是统一的。例如,这些是其中一个因素的水平:

> 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列是所有因素,并且它们具有不同的级别名称,指的是相同的含义,表达方式不同:正如您从示例中看到的,其中许多在级别名称中显示相同的字母:koko, kok, kokop ...我希望通过统一获得三个级别: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'

你能如此善意地暗示我将如何解决它吗?可能比我想象的要简单得多= /先谢谢!

r rename r-factor
2个回答
0
投票

我猜你需要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")

1
投票

我通常合并因子,如下例所示。我的子集级别对应于我的标准(... %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
© www.soinside.com 2019 - 2024. All rights reserved.