r - 基于模板与 R 中的匹配列更改数据框列的数据类型

标签 r dataframe dplyr data.table fread

我有 2 个数据框。

  • 模板 - 我将使用此数据框中的数据类型。
  • df - 我想根据模板更改此数据框的数据类型。

  • 我想根据第一个更改第二个数据帧的数据类型。假设我有以下用作模板的数据框。
    > template
    id <- c(1,2,3,4)
    a <- c(1,4,5,6)
    b <- as.character(c(0,1,1,4))
    c <- as.character(c(0,1,1,0))
    d <- c(0,1,1,0)
    template <- data.frame(id,a,b,c,d, stringsAsFactors = FALSE)
    
    > str(template)
    'data.frame':   4 obs. of  5 variables:
     $ id: num  1 2 3 4
     $ a : num  1 4 5 6
     $ b : chr  "0" "1" "1" "4"
     $ c : chr  "0" "1" "1" "0"
     $ d : num  0 1 1 0
    

    我正在寻找下面的东西。
  • 将模板的数据类型强制转换为 df 中的完全相同。
  • 它应该具有与模板框架中相同的列。

  • **注意- 如果 df 中不可用,它应该添加包含所有 NA 的附加列。
    > df
    id <- c(6,7,12,14,1,3,4,4)
    a <- c(0,1,13,1,3,4,5,6)
    b <- c(1,4,12,3,4,5,6,7)
    c <- c(0,0,13,3,4,45,6,7)
    e <- c(0,0,13,3,4,45,6,7)
    df <- data.frame(id,a,b,c,e)
    
    > str(df)
    'data.frame':   8 obs. of  5 variables:
     $ id: num  6 7 12 14 1 3 4 4
     $ a : num  0 1 13 1 3 4 5 6
     $ b : num  1 4 12 3 4 5 6 7
     $ c : num  0 0 13 3 4 45 6 7
     $ e : num  0 0 13 3 4 45 6 7
    

    期望输出-
    > output
        id  a  b  c  d
        1  6  0  1  0 NA
        2  7  1  4  0 NA
        3 12 13 12 13 NA
        4 14  1  3  3 NA
        5  1  3  4  4 NA
        6  3  4  5 45 NA
        7  4  5  6  6 NA
        8  4  6  7  7 NA
    
    > str(output)
    
    'data.frame':   8 obs. of  5 variables:
     $ id: num  6 7 12 14 1 3 4 4
     $ a : num  0 1 13 1 3 4 5 6
     $ b : chr  "1" "4" "12" "3" ...
     $ c : chr  "0" "0" "13" "3" ...
     $ d : logi  NA NA NA NA NA NA ...
    

    我的尝试-
    template <- fread("template.csv"),header=TRUE,stringsAsFactors = FALSE)
    n <- names(template)
    template[,(n) :=  lapply(.SD,function(x) gsub("[^A-Za-z0-90 _/.-]","", as.character(x)))]
    n <- names(df)
    df[,(n) :=  lapply(.SD,function(x) gsub("[^A-Za-z0-90 _/.-]","", as.character(x)))]
    output <- rbindlist(list(template,df),use.names = TRUE,fill = TRUE,idcol="template")
    

    在此之后,我编写输出数据帧,然后使用 write.csv 重新读取以获取数据类型。但是,我搞砸了数据类型。请建议任何适当的方法来处理它。

    最佳答案

    我会做

    res = data.frame(
      lapply(setNames(,names(template)), function(x) 
        if (x %in% names(df)) as(df[[x]], class(template[[x]])) 
        else template[[x]][NA_integer_]
      ), stringsAsFactors = FALSE)
    

    或与 magrittr
    library(magrittr)
    
    setNames(, names(template)) %>% 
      lapply(. %>% {
        if (. %in% names(df)) as(df[[.]], class(template[[.]])) 
        else template[[.]][NA_integer_]
      }) %>% data.frame(stringsAsFactors = FALSE)
    

    验证...
    'data.frame':   8 obs. of  5 variables:
     $ id: num  6 7 12 14 1 3 4 4
     $ a : num  0 1 13 1 3 4 5 6
     $ b : chr  "1" "4" "12" "3" ...
     $ c : chr  "0" "0" "13" "3" ...
     $ d : num  NA NA NA NA NA NA NA NA
    

    如果你要做很多这样的事情,我建议你查看 vetr 包。它对数据框及其列的模板有很好的方法。

    关于r - 基于模板与 R 中的匹配列更改数据框列的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48507499/

    相关文章:

    r - 按多个因子级别对数据框进行子集

    python - 是否有一个 groupby 函数可以创建一个从名称到下划线的新数据框?

    r - 如果并非所有列都存在于所有文件中,如何计算列的平均值?

    r - 如何在 ggplot 中绘制边界框?

    r - 两组向量上的 for 循环的 purrr 解决方案

    r - Dplyr产生NaN,而碱基R产生NA

    python - pandas 与索引的元素相乘

    python - pandas向量化运算获取字符串长度

    r - NSE lazyeval::lazy 与引用变量名时的替换

    将共享数据列中的多个值重新编码/替换为跨数据帧的单个值