您知道如何为数据框提供名称向量以更改数据框的列名或行名.是否有类似的方法来提供更改数据框中每列类的名称向量?当您使用colClasses读取带有read.table的数据框时,可以执行此操作.如果在R中创建数据帧怎么办?
DF <- as.data.frame(matrix(rnorm(25), 5, 5))
str(DF) #all numeric modes
names(DF) <- c("A", "A2", "B", "B2", "Z") #I want something like this for classes
some_classes_function_like_names(DF) <- c(rep("character", 3), rep("factor", 2))
#I can do it like this but this seems inefficient
DF[, 1:3] <- lapply(DF[, 1:3], as.character)
DF[, 4:5] <- lapply(DF[, 4:5], as.factor)
str(DF)
Run Code Online (Sandbox Code Playgroud)
编辑:我改变了lapply,因为sapply没有意义.
编辑2:如果有办法编写用户定义的函数也足够了
试试这个:
toCls <- function(x, cls) do.call(paste("as", cls, sep = "."), list(x))
replace(DF,, Map(toCls, DF, cls))
Run Code Online (Sandbox Code Playgroud)
第二个例子.另请尝试此示例(允许NA用于不更改其类的任何列).我们加载动物园包,因为它提供了一个as.Date具有默认原点的版本,我们定义了自己as.POSIXct2的版本同样避免必须另外指定原点.
library(zoo) # supplies alternate as.Date with a default origin
as.NA <- identity
as.POSIXct2 <- function(x) as.POSIXct(x, origin = "1970-01-01")
cls2 <- c("character", "Date", NA, "factor", "POSIXct2")
replace(DF,, Map(toCls, DF, cls2))
Run Code Online (Sandbox Code Playgroud)
请注意,它仅在将数字转换为"Date"或"POSIXct"有原点考虑因素时以及转换字符串(如"2000-01-01"无源)时需要在任何情况下指定,因此对于这种情况我们不需要加载动物园,我们也不需要我们自己的版本的as.POSIXct.
编辑:添加了另一个例子.
它似乎class(x) <- "factor"不起作用,也没有as(x, "factor"),所以我不知道做你想做的直接方式.
......但更明确的方式是:
# Coerces data.frame columns to the specified classes
colClasses <- function(d, colClasses) {
colClasses <- rep(colClasses, len=length(d))
d[] <- lapply(seq_along(d), function(i) switch(colClasses[i],
numeric=as.numeric(d[[i]]),
character=as.character(d[[i]]),
Date=as.Date(d[[i]], origin='1970-01-01'),
POSIXct=as.POSIXct(d[[i]], origin='1970-01-01'),
factor=as.factor(d[[i]]),
as(d[[i]], colClasses[i]) ))
d
}
# Example usage
DF <- as.data.frame(matrix(rnorm(25), 5, 5))
DF2 <- colClasses(DF, c(rep("character", 3), rep("factor", 2)))
str(DF2)
DF3 <- colClasses(DF, 'Date')
str(DF3)
Run Code Online (Sandbox Code Playgroud)
有几点:您可以根据需要添加更多案例.该函数的第一行允许您使用单个类名称进行调用.switch调用as函数和里程的最后一个"默认"情况可能会有所不同.
| 归档时间: |
|
| 查看次数: |
2172 次 |
| 最近记录: |