为数据框的“类”提供一个向量

您知道如何为数据框提供名称向量来更改数据框的列名或列名。 有没有类似的方法来提供一个名称矢量,以改变数据框中每列的类别? 你可以在使用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)

编辑:我改变了上面的宝宝,因为宝宝没有道理。

编辑2:如果有一种方法可以编写用户定义的函数,那也足够了


看来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)

几件事情:您可以根据需要添加更多案例。 该函数的第一行允许您使用一个类名称进行调用。 switch的最后一个“默认”情况将调用as函数,并且您的里程可能会有所不同。


尝试这个:

toCls <- function(x, cls) do.call(paste("as", cls, sep = "."), list(x))
replace(DF,, Map(toCls, DF, cls))

第二个例子。 也可以试试这个例子(它允许NA用于任何不改变类的列)。 我们加载了zoo包,因为它提供了一个具有默认原点的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))

请注意,只有在将数字转换为"Date""POSIXct"确保有原点考虑以及转换字符串(如"2000-01-01"无论何时都不需要指定原点,所以对于这种情况,我们会不需要加载动物园,我们不需要我们自己的as.POSIXct版本。

编辑:增加了另一个例子。

链接地址: http://www.djcxy.com/p/38281.html

上一篇: supply a vector to "classes" of dataframe

下一篇: Explain R tapply description