пустые столбцы данных - PullRequest
0 голосов
/ 12 июня 2018

У меня проблемы с созданием стандартизированных типов столбцов.Я пишу функцию, которая переходит от столбца к столбцу, ищет, какой тип данных должен быть из другого списка, а затем изменяет формат столбца на этот тип.

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)) {: аргумент имеет нулевую длину

Я думаю, что проблема возникает из-за неуверенности в том, как lapply передает свой аргументфункция.Как бы это исправить?

Пример данных:

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 ]

0 голосов
/ 12 июня 2018

Вы можете включить функции в необходимом порядке.то есть затем позвоните им оттуда, как показано

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
0 голосов
/ 12 июня 2018

Вы можете достичь этого, используя mapply.Вам нужно немного изменить свои стратегии.Передайте names из claims для работы в mapply и затем верните преобразованные данные из claims data.frame.

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")
...