在R程序中,当list包含POSIXct类型时,lapply返回错误的输出

时间:2015-12-02 22:13:57

标签: r dataframe lapply posixct

我正在编写一个函数来迭代数据框中的列,以按名称和类型构建每个列的列表。我使用lapply来完成工作。

我遇到了一个奇怪的问题,如果列的类型是POSIXct,那么我的函数实际上是在输出中重复每一列两次。

以下是示例数据框。

t1 <- data.frame(a = Sys.time(), 
                 b = "1", c=1, d=1.0, 
                 e=factor("one"), stringsAsFactors = FALSE)

t2 <- data.frame(b = "1", 
                 c=1, d=1.0, e=factor("one"), stringsAsFactors = FALSE)

t3 <- data.frame(a = Sys.time(), b = Sys.time(), 
                 c = "1", d=1, e=1.0, 
                 f=factor("one"), stringsAsFactors = FALSE)

功能:

listColumns <- function(df, halt = FALSE) {
  ct <- 0
  r <- unlist(lapply(names(df), FUN = function(x) {
    p <- paste0("* ", x[[1]], " (", class(df[[x]]), ")\n");
    ct <- ct + 1
    p
  }))
  stopifnot(!halt | (length(names(df)) == ct))
  r
}

如果您在listColumns()上尝试t2,则会获得正确的输出。如果您在其中一个或多个类型为t1的{​​{1}}或t3上进行尝试,则会获得日期/时间列的双重输出。

是什么给出了?

输出错误:

POSIXct

正确输出

> listColumns(t1)
[1] "* a (POSIXct)\n"   "* a (POSIXt)\n"    "* b (character)\n" "* c (numeric)\n"  
[5] "* d (numeric)\n"   "* e (factor)\n"  

0 个答案:

没有答案