从因子中删除特殊字符并在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)