首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对于不全部包含相同级别的列中的因子到整数

对于不全部包含相同级别的列中的因子到整数
EN

Stack Overflow用户
提问于 2021-02-03 19:24:40
回答 2查看 44关注 0票数 2

我有1.5万列的1.05亿条目,它们要么是"none", "01", "12", "2+"。不幸的是,并非所有列都包含所有因素。

例如:

代码语言:javascript
运行
复制
df <- data.frame(x1 = rep(c("none", "12", "2+"), each = 5),
                 x2 = rep(c("none", "01", "12"), each = 5)) %>% 
  data.table::as.data.table()

所以如果我做了

代码语言:javascript
运行
复制
df$x1<-as.integer(as.factor(df$x1))

我得到的和

代码语言:javascript
运行
复制
df$x2<-as.integer(as.factor(df$x2))

这不是我想要的。

所以我可以做:

代码语言:javascript
运行
复制
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栏。我不能一个接一个地对付他们,什么是最好的办法呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-03 19:30:32

如果要在多列上应用,请使用across

代码语言:javascript
运行
复制
library(dplyr)
df1 <- df %>%
    mutate(across(everything(), ~
      as.integer(factor(., levels = c("none","01","12","2+"))))

如果要忽略第一个索引,请使用-指定索引

代码语言:javascript
运行
复制
df1 <- df %>%
    mutate(across(-1, ~
      as.integer(factor(., levels = c("none","01","12","2+"))))

或者使用base R

代码语言:javascript
运行
复制
df[] <-  lapply(df, function(x) as.integer(factor(x, levels = c("none","01","12","2+"))))
票数 2
EN

Stack Overflow用户

发布于 2021-02-03 19:45:54

这是一个data.table解决方案。

使用大型数据集,而不是两次调用names(df),最好只调用一次,在转换df列之前分配值,然后使用150 K的名称向量。

代码语言:javascript
运行
复制
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

因此,现在使用上面的代码强制级别为整数。

代码语言:javascript
运行
复制
df[, (names(df)) := lapply(.SD, function(x){
  as.integer(factor(x, levels = levs))
}), .SDcols = names(df)]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66034363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档