for (i in 1:length(data[1,])){
if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
else {
data[,i]<-as.numeric(data[,i])
}
}
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
但是如果你在 fake_char 和 char_fac 做同样的事情,你'll be lucky, and get away with no NA':
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
如果您保存已转换的 data.frame 并检查 mode 和 class ,您将获得:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
所以,结论是: Yes, you can convert character vector into a numeric one, but only if it's elements are "convertible" to numeric. 如果向量中只有一个 character 元素,那么在尝试将该向量转换为 numerical 时会出错 .
只是为了证明我的观点:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
而现在,只是为了好玩(或练习),尝试猜测这些命令的输出:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
亲切的问候Patrick Burns! =)
2
使用 type.convert() 和 rapply() 的通用方式:
convert_types <- function(x) {
stopifnot(is.list(x))
x[] <- rapply(x, utils::type.convert, classes = "character",
how = "replace", as.is = TRUE)
return(x)
}
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
sapply(d, class)
#> char fake_char fac char_fac num
#> "character" "character" "factor" "factor" "integer"
sapply(convert_types(d), class)
#> char fake_char fac char_fac num
#> "character" "integer" "factor" "factor" "integer"
for(i in seq_along(names(df)){
potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
}
# and now just convert only the numeric ones
d <- sapply(d[,potential_numcol],as.numeric)
16 回答
如果
x
是dataframedat
的列名,而x
是因子类型,请使用:要将数据框列转换为数字,您只需执行以下操作: -
要素到数字: -
如果数据框有多种类型的列,某些字符,某些数字会尝试以下操作,只将包含数值的列转换为数字:
考虑到可能存在char列,这是基于@Abdou在Get column types of excel sheet automatically回答:
要将字符转换为数字,您必须通过应用将其转换为因子
您必须使用相同的数据创建两列,因为一列无法转换为数字 . 如果您进行一次转换,则会出现以下错误
所以,做了两列相同的数据后应用
它会成功地将字符转换为数字
我会添加评论(不能评价低)
只需添加user276042和pangratz
这将覆盖现有列x的值
蒂姆是对的,谢恩有一个遗漏 . 以下是其他示例:
我们的
data.frame
现在有一个因子列的摘要(计数)和as.numeric()
的数字摘要---这是错误的,因为它得到了数字因子水平---和as.numeric(as.character())
的(正确)摘要 .如果您遇到以下问题:
看看你的小数点 . 如果它们是“,”而不是“ . ” (例如“5,3”)以上不起作用 .
可能的解决方案是:
我相信这在一些非英语国家很常见 .
由于(仍然)没有人得到复选标记,我认为你有一些实际问题,主要是因为你没有指定你想要转换为
numeric
的矢量类型 . 我建议你应该使用transform
函数来完成你的任务 .现在我要证明某些“转换异常”:
让我们一瞥
data.frame
让我们运行:
现在你可能会问自己“哪里有异常?”好吧,我在R中碰到了很奇怪的东西,这不是最令人困惑的东西,但它会让你感到困惑,特别是如果你在睡觉之前读到这个 .
这里是:前两列是
character
. 我故意叫第二个fake_char
. 发现这个character
变量与Dirk在回复中创建的变量的相似性 . 它实际上是一个numerical
向量转换为character
. 第3和第4列是factor
,最后一列是"purely"numeric
.如果使用
transform
函数,则可以将fake_char
转换为numeric
,而不是char
变量本身 .但是如果你在
fake_char
和char_fac
做同样的事情,你'll be lucky, and get away with no NA':如果您保存已转换的
data.frame
并检查mode
和class
,您将获得:所以,结论是: Yes, you can convert character vector into a numeric one, but only if it's elements are "convertible" to numeric. 如果向量中只有一个
character
元素,那么在尝试将该向量转换为numerical
时会出错 .只是为了证明我的观点:
而现在,只是为了好玩(或练习),尝试猜测这些命令的输出:
亲切的问候Patrick Burns! =)
使用
type.convert()
和rapply()
的通用方式:在我的电脑(R v.3.2.3)中,
apply
或sapply
给出错误 .lapply
运作良好 .对我有帮助的东西:如果要转换的变量范围(或者只有一个变量),你可以使用
sapply
.有点荒谬,但仅举例如:
假设您的数据帧的第3,6-15和37列需要转换为数字,可以:
虽然您的问题严格依赖于数字,但在开始使用R时,很多转换都很难理解 . 我的目标是解决方法问题 . 这个问题类似于This Question .
类型转换可能是R的痛苦,因为(1)因素不能直接转换为数字,它们需要先转换为字符类,(2)日期是您通常需要单独处理的特殊情况,以及(3)跨数据帧列循环可能很棘手 . 幸运的是,“tidyverse”解决了大部分问题 .
此解决方案使用
mutate_each()
将函数应用于数据框中的所有列 . 在这种情况下,我们想要应用type.convert()
函数,它可以将字符串转换为数字 . 因为R喜欢因素(不确定为什么)应该保持字符的字符列变为因子 . 要解决此问题,mutate_if()
函数用于检测作为因子的列并更改为字符 . 最后,我想展示如何使用lubridate将字符类中的时间戳更改为日期时间,因为这也是通常是初学者的坚持块 .虽然其他人已经很好地讨论了这个话题,但我想补充一下这个额外的快速思路/提示 . 您可以使用regexp提前检查字符是否可能只包含数字 .
对于更复杂的正则表达式和一个简洁的学习/体验他们的力量,请看这个非常好的网站:http://regexr.com/
使用以下代码,您可以将所有数据框列转换为数字(X是我们要转换它的列的数据框):
并且为了将整个矩阵转换为数字,您有两种方式:要么:
要么:
或者,您可以使用
data.matrix
函数将所有内容转换为数字,但请注意,这些因素可能无法正确转换,因此将所有内容转换为character
更安全:我通常使用 this last one 如果我想 to convert to matrix and numeric simultaneously
与 hablar::convert
要轻松将多列转换为不同的数据类型,您可以使用
hablar::convert
. 语法简单:df %>% convert(num(a))
将列a从df转换为数字 .Detailed example
让我们将
mtcars
的所有列转换为字符 .使用
hablar::convert
:结果是: