[英]Subset columns if they meet a condition
我的任务:
在以下情况下,CA + CC应更改为factorial
。
CA = c(1,0,1,0,1)
CB = c(1,12,21,0,7)
CC = c(1,0,1,0,1)
mydf = data.frame(CA, CB, CC)
str(mydf)
'data.frame': 5 obs. of 3 variables:
$ CA: num 1 0 1 0 1
$ CB: num 1 12 21 0 7
$ CC: num 1 0 1 0 1
为什么? 因为这些行当前被描述为integer
和number
而不是factors
。 而且我假设某些机器学习算法会把事情混在一起。
使用baseR的一种方法:
#if all the values in a column are either 0 or 1 convert to factor
mydf[] <- lapply(mydf, function(x) {
if(all(x %in% 0:1)) {
as.factor(x)
} else {
x
}
})
出:
str(mydf)
#'data.frame': 5 obs. of 3 variables:
# $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
# $ CB: num 1 12 21 0 7
# $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2**
dplyr
的mutate_if
另一种方法
library(dplyr)
is_one_zero <- function(x) {
res <- all(unique(x) %in% c(1, 0))
return(res)
}
out <- mydf %>%
mutate_if(is_one_zero, as.factor)
str(out)
#'data.frame': 5 obs. of 3 variables:
# $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
# $ CB: num 1 12 21 0 7
# $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2
这是在R基中执行此操作的另一种方法
cols <- colSums(mydf == 0 | mydf == 1) == nrow(mydf)
mydf[cols] <- lapply(mydf[cols], as.factor)
str(mydf)
#'data.frame': 5 obs. of 3 variables:
# $ CA: Factor w/ 2 levels "0","1": 2 1 2 1 2
# $ CB: num 1 12 21 0 7
# $ CC: Factor w/ 2 levels "0","1": 2 1 2 1 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.