转换dataframe列类型的函数

Mik*_*kko 4 r function type-conversion

R通常以"错误"格式理解数据框列,或者您只需要将列类从因子更改为字符以进行修改.我以前用以下方式更改了列类:

set.seed(1)

df <- data.frame(x = 1:10,
y = rep(1:2, 5),
k = rnorm(10, 5,2),
z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
j = c(rep(c("a", "b", "c"), 3), "d"))

x <- c("y", "z")

for(i in 1:length(x)){
df[,x[i]] <- factor(df[,x[i]])}
Run Code Online (Sandbox Code Playgroud)

并回到数字:

x <- 1:5

for(i in 1:length(x)){
df[,x[i]] <- as.numeric(as.character(df[,x[i]]))} # Character cannot become numeric
Run Code Online (Sandbox Code Playgroud)

在我看来,也许有更好的方法做到这一点.我发现了这个问题,这正是我所需要的:

convert.magic <- 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)
}
Run Code Online (Sandbox Code Playgroud)

但是,对于此函数,必须为每列指定矢量类型:

convert.magic(df, rep("factor",5))

convert.magic(df, c("character", "factor"))
# Error in FUN(1:5[[1L]], ...) : could not find function "FUN1"
Run Code Online (Sandbox Code Playgroud)

有人可以帮助我并重建这个功能,以便它可以使用列名和数字吗?我担心这对我来说太先进了......

x <- c("y", "z")
convert.magic(df, "character", x)
Run Code Online (Sandbox Code Playgroud)

Thi*_*rry 6

df <- data.frame(x = 1:10,
                 y = rep(1:2, 5),
                 k = rnorm(10, 5,2),
                 z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
                 j = c(rep(c("a", "b", "c"), 3), "d"))

convert.magic <- function(obj, type){
  FUN1 <- switch(type,
                 character = as.character,
                 numeric = as.numeric,
                 factor = as.factor)
  out <- lapply(obj, FUN1)
  as.data.frame(out)
}

str(df)
str(convert.magic(df, "character"))
str(convert.magic(df, "factor"))
df[, c("x", "y")] <- convert.magic(df[, c("x", "y")], "factor")
Run Code Online (Sandbox Code Playgroud)

  • 这会转换整个data.frame.稍微修改一下就比我更接近:`convert.magic < - function(obj,type,cols){FUN1 < - switch(type,character = as.character,numeric = as.numeric,factor = as.factor) obj [,cols] < - lapply(obj [,cols],FUN1)as.data.frame(obj)}`如何在此添加BenBarnes注释(`as.numeric(levels(f))[f]`)功能? (3认同)