3 回答
TA贡献1831条经验 获得超10个赞
我对Brandon的回答的评论switch如下:
convert.magic <- function(obj,types){
for (i in 1:length(obj)){
FUN <- switch(types[i],character = as.character,
numeric = as.numeric,
factor = as.factor)
obj[,i] <- FUN(obj[,i])
}
obj
}
out <- convert.magic(foo,c('character','character','numeric'))
> str(out)
'data.frame': 10 obs. of 3 variables:
$ x: chr "1" "2" "3" "4" ...
$ y: chr "red" "red" "red" "blue" ...
$ z: num 15254 15255 15256 15257 15258 ...
对于真正的大数据帧,您可能要使用lapply而不是for循环:
convert.magic1 <- function(obj,types){
out <- lapply(1:length(obj),FUN = function(i){FUN1 <- switch(types[i],character = as.character,numeric = as.numeric,factor = as.factor); FUN1(obj[,i])})
names(out) <- colnames(obj)
as.data.frame(out,stringsAsFactors = FALSE)
}
执行此操作时,请注意R中强制数据的一些复杂性。例如,从因数转换为数值通常涉及as.numeric(as.character(...))。此外,要注意data.frame()和as.data.frame()S转换性格因素的默认行为。
TA贡献1895条经验 获得超7个赞
我知道我回答的时间很晚,但是将循环和属性函数一起使用是解决问题的简单方法。
names <- c("x", "y", "z")
chclass <- c("character", "character", "numeric")
for (i in (1:length(names))) {
attributes(foo[, names[i]])$class <- chclass[i]
}
- 3 回答
- 0 关注
- 767 浏览
添加回答
举报