gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 20:29:59 25 4
gpt4 key购买 nike

我有 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com