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

编辑:我更改了上面的sapply为lapply,因为sapply没有意义。

编辑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函数,您的里程可能会有所不同。

关于r - 向数据帧的 "classes"提供一个向量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9214819/

10-12 17:33
查看更多