从因子中删除特殊字符并在R中转换为数字

从因子中删除特殊字符并在R中转换为数字,r,character-encoding,R,Character Encoding,我需要把一个杂乱的因子转换成一个数字。示例数据如下所示: x <- structure(c(4L, 5L, 1L, 6L, 6L, 2L, 3L), .Label = c("", "106", "39", "8", "80", "chyb\x92 foto"), class = "factor") 但是,我的预期代码的第一行会产生警告,并且文本不会替换为NAs x[grepl("[a-z]", x) | x==""] <- NA x <- as.numeric(le

我需要把一个杂乱的因子转换成一个数字。示例数据如下所示:

x <- structure(c(4L, 5L, 1L, 6L, 6L, 2L, 3L), 
    .Label = c("", "106", "39", "8", "80", "chyb\x92 foto"), class = "factor")
但是,我的预期代码的第一行会产生警告,并且文本不会替换为
NAs

x[grepl("[a-z]", x) | x==""] <- NA
x <- as.numeric(levels(x))[x]
我们可以这样做

as.numeric(as.character(x))
#[1]   8  80  NA  NA  NA 106  39

如果我们使用的是
grepl
,我们将确保只查找字符串从开始(
^
)到结束(
$
)的数字部分,并对其求反(
),然后将这些值分配给NA。由于“x”是一个
因子
,我们可以通过
As.numeric(As.character
)转换为
数值

 x[!grepl("^[0-9.]+$", x)] <- NA
 as.numeric(as.character(x))
 #[1]   8  80  NA  NA  NA 106  39

x[!grepl(“^[0-9.]+$”,x)]看来我找到了解决方案。多亏akrun、Cath和Tensibai为我指明了
编码
。我的
级别(x)
被编码为“未知”,在指令读取
字节时,
grepl
用文本找到了值:

grepl("[a-z]", x, useBytes = TRUE)
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
Tensibar关于指定编码的建议为
grepl
提供了相同的功能

levels(x) <- enc2utf8(levels(x))
grepl("[a-z]", x, useBytes = FALSE)

级别(x)是的。但是为什么不能
grepl
找到带有文本的单元格?@nya它被标记为dupe。请检查这是否对您有效,或者我们可以重新打开。我将回答该部分绝对不行。我的代码
x@nya我添加了
grepl
part@nya以你的例子来说,我没有收到R3.3.0的警告。也许,你需要更改sett具有utf-8字符的ings REP采用因子(向量)的整数部分,而不是级别。可能读取
?因子
?我通过您的行获得所需的输出,而不使用warnings@Tensibai我不认为这个因素是问题所在。
grepl(“a-z”,levels(x))
会生成相同的警告。@nya好的,我们知道原因了(或多或少),现在为什么在捷克语中似乎是无效字符还有一个问题:您可以添加
编码(levels(x))
?(可能还有
levels(x))的结果吗
grepl("[a-z]", x, useBytes = TRUE)
[1] FALSE FALSE FALSE  TRUE  TRUE FALSE FALSE
levels(x) <- enc2utf8(levels(x))
grepl("[a-z]", x, useBytes = FALSE)