首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R:设置数据框中的变量类型和级别,基于列表

R:设置数据框中的变量类型和级别,基于列表
EN

Stack Overflow用户
提问于 2020-12-13 12:44:58
回答 1查看 30关注 0票数 1

我有一个这样的数据框架:

代码语言:javascript
复制
df <- data.frame(
  v1 = sample(c("L1","L2"),5,replace = TRUE), 
  v2 = sample(c("F1","F3"),5,replace = TRUE),
  v3 = sample(seq(1,5),5,replace = T)
)

我希望(1)根据命名列表设置变量的类型:

代码语言:javascript
复制
typs <- list("v1" = "factor", "v2" = "factor", "v3" = "numeric")

以及(2)设置因子变量的级别:

代码语言:javascript
复制
list.levels <-  list("v1" = c("L1","L2","L3"), "v2" = c("F1","F2","F3"))

理想情况下,我希望使用一种通用的方法,该方法可以应用于具有动态列数的数据帧。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-13 13:12:44

你只需要编写你自己的函数来做清理。这里有一种可能性

代码语言:javascript
复制
fix_data <- function(data, types=NULL, flevels=NULL) {
  if(!is.null(types) && length(types)>0) {
    data[,names(types)] <- Map(function(col, type) {
      if (type=="factor") {
        factor(data[[col]])
      } else if (type=="numeric") {
        as.numeric(data[[col]])
      } else {
        stop(paste("unsupported type:", type))
      }
    }, names(types), types)
  }
  if(!is.null(flevels) && length(flevels)>0) {
    data[,names(flevels)] <- Map(function(col, levels) {
      factor(data[[col]], levels=levels)
    }, names(flevels), flevels)
  }
  data
}

然后将其命名为fix_data(df, typs, list.levels)。请注意,它返回一个新的data.frame,因此您可以覆盖原始变量或将其保存到新变量中。

基本思想是循环遍历列表中的名称并进行适当的转换。我们使用Map遍历列表中的名称和值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65272440

复制
相关文章

相似问题

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