使用另一个参考数据框更改数据框中的变量类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用另一个参考数据框更改数据框中的变量类相关的知识,希望对你有一定的参考价值。

我正在寻找一些方法来改变一个数据框中的变量类,方法是使用另一个数据框的引用,该数据框具有每个变量的类信息。

我有一个包含大约150个变量的数据。所有变量都是字符格式。现在我想根据类型改变每个变量的类。为此,我们创建了一个单独的数据框,其中包含每个变量的类信息。让我用一个示例数据框来解释。

考虑我的原始数据框是df与5个变量 -

df <- data.frame(A="a",B="1",C="111111",D="d",E="e")

现在我们有另一个数据框“variable_info”,它只包含2个变量,一个是“variable_name”,另一个是“variable_class”。

variable_info <- data.frame(variable_name=c("A","B","C","D","E"),variable_class=c("character","integer","numeric","character","character"))

现在使用variable_info数据框我想更改df中每个变量的类,以便它们的类在“variable_info $ variable_class”中指定,将变量名称与“variable_info $ variable_name”链接起来

我们如何为数据框执行此操作?在data.table中执行此操作会很好吗?我们怎样才能在data.table中做到这一点?

谢谢!!

普拉萨德

答案

你可以这样试试:

确保两个表的顺序相同:

variable_info <- variable_info[match(variable_info$variable_name, names(df)),]

创建函数调用列表:

funs <- sapply(paste0("as.", variable_info$variable_class), match.fun)

然后将它们映射到每一列:

df[] <- Map(function(dd, f) f(as.character(dd)), df, funs)

使用data.table你可以用几乎相同的方式完成它,除了你用以下方法替换最后一行:

library(data.table)
dt <- as.data.table(df) # or use setDT(df)
dt[, names(dt) := Map(function(dd, f) f(as.character(dd)), dt, funs)]
另一答案

另一种方法是使用函数。此函数可以接受任何一对数据帧,找到它们的公共列,并将第一个类分配给第二个列中的列。

    matchColClasses<- function(df1, df2){
    # Purpose:  protect joins from column type mismatches - a problem with multi-column empty df          
    # Input:    df1 - master for class assignments, df2 - for col reclass and return.
    # Output:   df2 with shared columns classed to match df1
    # Usage:    df2 <- matchColClasses(df1, df2)

      sharedColNames <- names(df1)[names(df1) %in% names(df2)]
      sharedColTypes <- sapply(df1[,sharedColNames], class)

      for (n in sharedColNames) {
        class(df2[, n]) <- sharedColTypes[n]
      }

      return(df2)
     }

以上是关于使用另一个参考数据框更改数据框中的变量类的主要内容,如果未能解决你的问题,请参考以下文章

确定熊猫数据框中的列值何时更改

如何将数据框中的值分配给在另一个数据框中创建的十分位数?

根据另一个数据框中的数字将项目数量附加到行

如何识别和标记熊猫数据框中的相似行

如何使用熊猫更改数据框中的日期时间格式? [复制]

我的(Vba)代码仅适用于列表中的1个变量,并且在列表框中使用多个变量时仅返回空白