我有1.5万列的1.05亿条目,它们要么是"none", "01", "12", "2+"。不幸的是,并非所有列都包含所有因素。
例如:
df <- data.frame(x1 = rep(c("none", "12", "2+"), each = 5),
x2 = rep(c("none", "01", "12"), each = 5)) %>%
data.table::as.data.table()所以如果我做了
df$x1<-as.integer(as.factor(df$x1))我得到的和
df$x2<-as.integer(as.factor(df$x2))这不是我想要的。
所以我可以做:
require(magrittr)
df$x1<-factor(df$x1,levels = c("none","01","12","2+")) %>% as.integer()
df$x2<-factor(df$x2,levels = c("none","01","12","2+")) %>% as.integer()这是工作,但我有150K栏。我不能一个接一个地对付他们,什么是最好的办法呢?
发布于 2021-02-03 19:30:32
如果要在多列上应用,请使用across
library(dplyr)
df1 <- df %>%
mutate(across(everything(), ~
as.integer(factor(., levels = c("none","01","12","2+"))))如果要忽略第一个索引,请使用-指定索引
df1 <- df %>%
mutate(across(-1, ~
as.integer(factor(., levels = c("none","01","12","2+"))))或者使用base R
df[] <- lapply(df, function(x) as.integer(factor(x, levels = c("none","01","12","2+"))))发布于 2021-02-03 19:45:54
这是一个data.table解决方案。
使用大型数据集,而不是两次调用names(df),最好只调用一次,在转换df列之前分配值,然后使用150 K的名称向量。
library(data.table)
levs <- c("none","01","12","2+")
df[, (names(df)) := lapply(.SD, factor, levels = levs), .SDcols = names(df)]
identical(levels(df$x1), levels(df$x2))
#[1] TRUE因此,现在使用上面的代码强制级别为整数。
df[, (names(df)) := lapply(.SD, function(x){
as.integer(factor(x, levels = levs))
}), .SDcols = names(df)]https://stackoverflow.com/questions/66034363
复制相似问题