如何解决将相同的因子水平应用于 R 中具有不同水平数量的多个变量
我有一个带有 data.table
和 168 variables
的 8,278 observations
。变量 69:135
最初存储为字符串。他们应该成为区域假人,我想以 2 级(=是,公司在这里运营)和 1 级(=否,公司不在这里运营)结束。问题是原始变量中有三种不同的输入组合:1) "TRUE","1","0","FALSE",2) "TRUE",和 3) "1" ,“0”。此外,约。 5 个变量只有一个值,“0”或“1”。这里给出了一个例子:
#generating replicable data
structure(list(
region1 = structure(c("TRUE",NA),class = "character"),region2 = structure(c("1",NA,region3 = structure(c(NA,"TRUE","FALSE"),region4 = structure(c(NA,"0"),class = "character")),.Names = c("region1","region2","region3","region4"),row.names = c(NA,5),class = "data.table")
#this gives:
# region1 region2 region3 region4
#1 TRUE 1 <NA> <NA>
#2 FALSE 1 FALSE 0
#3 0 0 TRUE 0
#4 1 <NA> <NA> <NA>
#5 <NA> <NA> FALSE 0
我正在寻找一种方法,可以一次性将所有变量的“TRUE”和“1”替换为 2,将“FALSE”和“0”替换为 1。所以想要的结果是:
# region1 region2 region3 region4
#1: 2 2 NA NA
#2: 1 2 1 1
#3: 1 1 2 1
#4: 2 NA NA NA
#5: NA NA 1 1
我已经看过了
Apply factor levels to multiple columns with missing factor levels 和 Change level of multiple factor variables。
然而,这对我没有帮助。
我使用嵌套的 ifelse()
命令尝试了以下操作:
library(data.table)
library(forcats)
check <- cbind(dt[1:68],as.data.table(apply(dt[69:135],2,function(x) {
ifelse("1" %in% x & "TRUE" %in% x,fct_collapse(x,"2" = c("TRUE","1"),"1" = c("FALSE","0")
),ifelse("1" %in% x & !("TRUE" %in% x),"2" = "1","1" = "0"),"2" = "TRUE","1" = "FALSE"
)))
}
)),dt[136:168])
但是之前的代码没有给我想要的结果。它运行了,但我收到一条警告消息,当检查相应的变量时,它们仍然作为带有原始输入的字符串存储。
# examples of warnings
1: Unknown levels in `f`: TRUE,FALSE
2: Unknown levels in `f`: TRUE,FALSE
3: Unknown levels in `f`: TRUE,FALSE
4: Unknown levels in `f`: 0
5: Unknown levels in `f`: TRUE,FALSE
6: Unknown levels in `f`: TRUE,FALSE
7: Unknown levels in `f`: 0
单独使用以及不与fct_collapse
嵌套的 ifelse()
命令结合使用时:
#the ifelse statement works
ifelse("TRUE" %in% dt$region1,"FALSE")
ifelse(5 %in% dt$region1,"FALSE")
#also the nested ifelse statement works
ifelse("1" %in% dt$region1 & "TRUE" %in% dt$region1,ifelse("1" %in% dt$region1 & !("TRUE" %in% dt$region1),1,2
))
ifelse("1" %in% dt$region2 & "TRUE" %in% dt$region2,ifelse("1" %in% dt$region2 & !("TRUE" %in% dt$region2),2
))
有人知道如何解决这个问题吗?
非常感谢您提前提供任何建议!
解决方法
这是在 set()
循环中调用 for
的一种方法。
library(data.table)
f <- function(x){
x <- as.character(x)
i1 <- x %in% c("TRUE","1")
i0 <- x %in% c("FALSE","0")
x[which(i1)] <- "2"
x[which(i0)] <- "1"
as.integer(x)
}
for (j in seq_along(dt)) set(dt,j = j,value = f(dt[[j]]))
dt
# region1 region2 region3 region4
#1: 2 2 NA NA
#2: 1 2 1 1
#3: 1 1 2 1
#4: 2 NA NA NA
#5: NA NA 1 1
感谢 jangorecki's comment 一个更简单的方法是
dt[,names(dt) := lapply(dt,f)]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。