代码之家  ›  专栏  ›  技术社区  ›  Daniel V

数据帧重叠列

  •  1
  • Daniel V  · 技术社区  · 6 年前

    我很难创建标准化的列类型。我正在编写一个从列到列的函数,从另一个列表中查找它应该是什么数据类型,然后将列格式更改为该类型。

    as.data.frame(lapply(claims, 
     function(fun.col){
    
       col.type <- claims.mapping$type[match(colnames(fun.col),
                                             claims.mapping$col.name.std)]
    
       if (is.na(col.type)) {
         #Do nothing
       } else if (col.type == "Date") {
         as.Date(fun.col[], origin = "1900-01-01")
       } 
     }))
    

    这就产生了错误

    if(is.na(col.type))中的错误:参数的长度为零

    我认为这个问题是由于不确定如何将它的参数循环传递给函数而引起的。我该如何解决这个问题?

    示例数据:

    claims <- structure(list(a = c(13245, 43220, 45221), b = 1:3), row.names = (NA, -3L), class = "data.frame")
    
    claims.mapping <- structure(list(col.name.std = structure(1:3, .Label = c("a", "b", "c"), class = "factor"), x = c("Date", "numeric", "character")), row.names = c(NA, -3L), class = "data.frame")
    

    预期输出:

    structure(list(a = structure(c(-12322, 17653, 19654), class = "Date"), b = 1:3), row.names = c(NA, -3L), class = "data.frame")
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   MKR    6 年前

    你可以用 mapply .你需要改变一下你的策略。通过 names 属于 claims 发挥作用 映射 然后返回转换后的数据 声称 数据帧。

    as.data.frame(mapply(function(fun.col){
      col.type <- claims.mapping$x[match(fun.col,
                                            claims.mapping$col.name.std)]
    
      if (is.na(col.type)) {
        claims[,fun.col]
      } else if (col.type == "Date") {
        as.Date(claims[,fun.col], origin = "1990-01-01")
      } else{
        claims[,fun.col]
      }
    },names(claims), SIMPLIFY = FALSE))
    
    #            a b
    # 1 2026-04-07 1
    # 2 2108-05-02 2
    # 3 2113-10-24 3
    

    从OP修正的数据:

    claims <- structure(list(a = c(13245, 43220, 45221), b = 1:3), .Names = c("a", "b"), row.names = c(NA, -3L), class = "data.frame")
              structure(list(a = 10:20, b = 21:31), .Names = c("a", "b"), row.names = c(NA, -11L), class = "data.frame")
    
    claims.mapping <- structure(list(col.name.std = structure(1:3, .Label = c("a", "b", "c"), class = "factor"), x = c("Date", "numeric", "character")), row.names = c(NA, -3L), class = "data.frame")
    
        2
  •  0
  •   Onyambu    6 年前

    您可以按需要的顺序包含函数。我从那里给他们打电话,如图所示

    claims.mapping$fun=c(function(x)as.Date(x,"1990-01-01"),as.numeric,as.character)
    ss=function(x,y) with(claims.mapping,fun[col.name.std==y][[1]])(x)
    data.frame(Map(ss ,claims,names(claims)))
               a b
    1 1936-04-07 1
    2 2018-05-02 2
    3 2023-10-24 3
    

    或者你可以试试

    data.frame(Map( function(i,j)
    {
     k= c(function(x)as.Date(x,"1900-01-01"),as.numeric,as.character)
     k[claims.mapping$col.name.std==j][[1]](i) 
    },
    claims,names(claims))
    )
               a b
    1 1936-04-07 1
    2 2018-05-02 2
    3 2023-10-24 3