如何在R中将数据框中的所有数字字符串转换为数字?

3

我对R语言还很陌生,我有一个从文件读取的大型数据框。它里面的列可以是普通的字符串,如"Iceland",也可以是数字但表示为字符串的列,如"25.1"。是否有一种方法可以将所有只包含数字的字符串转换为数字类型?

我知道如何为单个列执行此操作:var <- as.numeric(dataFrame$var) 但这种方式不太有效,因为我的数据框大约有160个列。

我尝试了以下方式将整个数据框进行转换,但并没有成功:

DF2 <- lapply(DF1, function(x) {
  ifelse(!is.na(suppressWarnings(as.numeric(x))), as.numeric(as.character(x)), x)
})

测试使用DF2$colName查看列返回的是"字符"而不是"数值"。这还会将数据框转换为列表。

另外,我使用 read.csv() 读取数据框时没有使用除文件名之外的任何参数。此外,列不混合类型,它们要么全部是普通字符串,要么全部是数值字符串。

谢谢!


1
lapply默认返回列表。如果想要返回数据框(dataframe),我们可以保持原始的数据结构,使用空括号并将函数的输出分配给其值:DF2[] <- lapply(DF1, ... - GuedesBF
1个回答

5
我们可以使用type.convert函数。
示例数据。
df <- data.frame(a=c("2.1"), b='iceland')

检查原始示例数据中的类:

df |> lapply(\(x) class(x))

$a
[1] "character"

$b
[1] "character"

转换

df <- type.convert(df, as.is =TRUE)

测试输出

df |> lapply(\(x) class(x))

$a
[1] "numeric"

$b
[1] "character"

谢谢!这个很好用。出于好奇,我知道 |> 是管道运算符。它如何与您在 lapply() 中使用的语法一起工作? - Russell H
1
很高兴能够帮助。这个语法是lambda函数的简写。而管道符号将左侧对象作为第一个参数发送到右侧函数中。y |> lapply(\(x) some_function(x))lapply(y, function(x) some_function(x))相同。 - GuedesBF
1
这篇关于管道的博客文章非常清晰和有启发性:https://ivelasq.rbind.io/blog/understanding-the-r-pipe/ - GuedesBF

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