有没有自动纠正数据框中所有变量类别的方法?

8
我有一个包含大约250个变量的数据框。不幸的是,使用sqldf从SQL数据库导入时,所有这些变量都被作为字符类导入。 问题在于:它们中的所有变量都不应该是字符类。其中有数值变量、整数以及日期。我想建立一个可以运行所有变量的模型,为此我需要确保变量具有正确的类别。逐个进行可能是最好的方法,但仍然非常繁琐。
如何自动纠正所有类别?也许有一种方法可以检测列中是否有字母字符或只有数字字符?
我认为自动方法无法完美地纠正所有类别。但它可能会纠正大多数类别,那些不好的,我可以手动处理。
我添加了一个sqldf标签,以防有人知道在导入数据时纠正这个问题的任何方法,但我认为这不是sqldf的问题,而是数据库的问题。
1个回答

9
最接近数据框自动类型转换的方法可能是:
df[] <- lapply(df, type.convert)

其中df是你的数据集。函数type.convert()

根据需要将字符向量转换为逻辑、整数、数字、复数或因子。

阅读一下help(type.convert),它可能正是你想要的。

在我的经验中,type.convert()非常可靠。如果你不想将字符强制转换为因子,可以使用as.is = TRUE。而且它被许多重要的R函数(如read.table)内部使用,所以它绝对安全。

这里有一个快速的例子,在iris上运行。首先我们将所有列都改为字符,然后运行type.convert()

## Original column classes in iris
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#    "numeric"    "numeric"    "numeric"    "numeric"     "factor" 

## Change all columns to character
iris[] <- lapply(iris, as.character)
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#  "character"  "character"  "character"  "character"  "character" 

## Run type.convert()
iris[] <- lapply(iris, type.convert)
sapply(iris, class)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
#    "numeric"    "numeric"    "numeric"    "numeric"     "factor" 

我们可以看到列已经恢复为它们原本的类别,这是因为type.convert()将列转换成“最合适”的类型。

你好Richard,最近我在另一个数据框上使用了这个程序,但是出现了这个错误 Error in FUN(X[[i]], ...) : the first argument must be of mode character。我想知道你是否知道这是为什么。 - jgozal
看起来type.convert()函数期望它的第一个参数是字符向量。我尝试将我的df转换为as.character(df),但这只是将所有内容转换为因子类型。 - jgozal
如果您希望字符保持为字符而不被强制转换为因子,请在type.convert中设置as.is=TRUE - Rich Scriven
那样做不会将其他列转换为字符吗? - jgozal
1
@jgozal - 不,你需要执行 df[] <- lapply(df, function(x) type.convert(as.character(x), as.is = TRUE))。这样你就不会有因子列了。如果你想让 R 自己决定因子,可以省略 as.is = TRUE。你不能在数据框上运行 as.character(),只能逐个对原子向量运行。 - Rich Scriven
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接