如何在空 R 数据框中设置多列的列类型?

How can I set column types of several columns in empty R data frame?

我正在尝试创建一个具有特定列名称和列类型的空数据框。我拥有的是一个接收具有以下结构的列表的函数:

list$
    $name_1$
           $class
           $more_stuff
    $name_2$
           $class
           $more_stuff
    ...

因此,我创建了一个空数据框:

df <- data.frame(matrix(ncol = length(names(my_list)), nrow = 0))
colnames(df) <- names(my_list)
# set column types

列表中的每一项都有一个包含数据类型的 'class' 属性。这些可以是:“字符”、“数字”、“日期时间”、“布尔值”,它们必须转换为:

"character" -> character
"numeric"   -> numeric
"datetime"  -> datetime<UTC>
"boolean"   -> character

因为这个数据框将被连接到另一个具有这些列的数据框。

我试过类似的方法,但日期时间列不正确:

  for (i in c(1:length(my_list))) {
    cast_function = switch(my_list[[i]]$class,
                           'character' = as.character,
                           'numeric'   = as.numeric,
                           'datetime'  = as.POSIXct,
                           'boolean'   = as.character)

    empty_df[[i]] <- cast_function(empty_df[[i]])
  }

我该如何执行此操作?有没有更好的办法?

提前致谢

我认为此代码段包含您可能需要的所有元素:

lst <- list(
  x = list("character", letters[1:5]),
  y = list("numeric", as.double(1:5)),
  w = list("boolean", as.character(as.integer(c(
    T, F, F
  )))),
  z = list("datetime", Sys.time())
)

my_classes <- unlist(lapply(lst, function(x) x[1]))

mapping <- list(
  character = character(),
  numeric = numeric(),
  datetime = structure(double(), class = c("POSIXct", "POSIXt")),
  boolean = character()
)

do.call(tibble::tibble, args = mapping[my_classes])
#> # A tibble: 0 × 4
#> # … with 4 variables: character <chr>, numeric <dbl>, boolean <chr>,
#> #   datetime <dttm>

根据植物的回答,我得到了这个解决方案:

my_list <- list(
  name_1   = list( class = "character", stuff = 11 ),
  name_2   = list( class = "boolean", stuff = 22 ),
  name_3   = list( class = "numeric", stuff = 22 ),
  name_rr  = list( class = "character", stuff = 54 ),
  name_56  = list( class = "datetime", stuff = 89 ),
  name_zzz = list( class = "boolean", stuff = 134 )
)


my_classes <- list()
for (i in my_list) {
  my_classes <- c(my_classes, i$class)
}

mapping <- list(
  character = character(),
  numeric = numeric(),
  datetime = structure(double(), class = c("POSIXct", "POSIXt")),
  boolean = character()
)

my_args <- mapping[unlist(my_classes)]

names(my_args) <- names(my_list)

do.call(tibble::tibble, args = my_args)

# my_function(my_list_1)
# A tibble: 0 x 6
# ... with 6 variables: character <chr>, boolean <chr>, numeric <dbl>, character <chr>, datetime <dttm>, boolean <chr>