我正在编写一个函数来迭代数据框中的列,以按名称和类型构建每个列的列表。我使用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"