替换多个因素的水平
Replacing levels of multiple factors
我需要在一个数据框中替换多个因素的水平,以便它们全部统一。
例如,这些因素之一的水平:
> 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
...
我想统一得到三个级别:kokop
、osa
和kes
。此外,以数字 1
和 2
命名的级别应分别重新编码为 kokop
和 osa
。
到目前为止,我尝试过的事情都没有成功,恐怕是因为我的思考方式比实际情况更复杂:我尝试了使用 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'
你能不能告诉我你会如何解决这个问题?可能比我想的要简单得多 =/ 先谢谢了!
我通常合并因子,如下例所示。
我将符合我的标准 (... %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
我猜您需要结合使用 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")
我需要在一个数据框中替换多个因素的水平,以便它们全部统一。 例如,这些因素之一的水平:
> 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
...
我想统一得到三个级别:kokop
、osa
和kes
。此外,以数字 1
和 2
命名的级别应分别重新编码为 kokop
和 osa
。
到目前为止,我尝试过的事情都没有成功,恐怕是因为我的思考方式比实际情况更复杂:我尝试了使用 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'
你能不能告诉我你会如何解决这个问题?可能比我想的要简单得多 =/ 先谢谢了!
我通常合并因子,如下例所示。
我将符合我的标准 (... %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
我猜您需要结合使用 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")