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

时间:2016-07-26 09:07:08

标签: r character-encoding

我需要将凌乱的因素转换为数字。示例数据如下所示:

x <- structure(c(4L, 5L, 1L, 6L, 6L, 2L, 3L), 
    .Label = c("", "106", "39", "8", "80", "chyb\x92 foto"), class = "factor")

我想要的输出是:

x
[1]   8  80  NA  NA  NA 106  39
class(x)
"numeric"

但是,我的预期代码的第一行会产生警告,文字不会替换为NAs

x[grepl("[a-z]", x) | x==""] <- NA
x <- as.numeric(levels(x))[x]
  

警告讯息:
  1:在grepl(“[a-z]”,x)中:输入字符串4在此语言环境中无效
  2:在grepl(“[a-z]”,x)中:输入字符串5在此语言环境中无效

然后第二行正确运行,并通过强制引入NAs提供正确的输出。为什么grepl无法识别某些因素级别的字母,as.numeric如何选择它们并将其替换为NAs

question中选择了数字转换因子。但是,它的工作原理并没有回答我的问题。

sessionInfo()
R version 3.3.0 (2016-05-03)
Platform: x86_64-apple-darwin13.4.0 (64-bit)
Running under: OS X 10.11.6 (El Capitan)

locale:
[1] cs_CZ.UTF-8/cs_CZ.UTF-8/cs_CZ.UTF-8/C/cs_CZ.UTF-8/cs_CZ.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.3.0

2 个答案:

答案 0 :(得分:1)

我们可以做到

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

如果我们使用的是grepl,我们会确保我们只找到从开头(^)到结尾($)的数字部分的字符串和否定({{ 1}})然后将这些值分配给NA。作为&#39; x&#39;是!,我们可以factor转换为numeric

as.numeric(as.character

答案 1 :(得分:1)

我似乎找到了解决方案。感谢akrun,Cath和Tensibai将我指向Encoding。我的levels(x)被编码为“未知”,当grepl被指示阅读bytesgrepl("[a-z]", x, useBytes = TRUE) [1] FALSE FALSE FALSE TRUE TRUE FALSE FALSE 找到了包含文字的值:

grepl

Tensibar建议指定编码为levels(x) <- enc2utf8(levels(x)) grepl("[a-z]", x, useBytes = FALSE) 提供相同的功能。

grepl

as.numeric处理重音字符和各种编码的复杂能力不同,as.numeric(levels(x))[x]接受一个对象并查找它是否可以解释为数字。哪个文本,无论编码如何,都不是。

使用package com.acorney.migration; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteQueryBuilder; import com.readystatesoftware.sqliteasset.SQLiteAssetHelper; /** * Created by acorney on 25/07/2016. */ public class databaseHelper extends SQLiteAssetHelper { private static final String TAG = SQLiteAssetHelper.class.getSimpleName(); private static final String DATABASE_NAME = "peopleDatabase.db"; private static final int DATABASE_VERSION = 1; public databaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } 进行因子转换可能是一种安全的方法,可以自行使用,而无需先检查有问题的值。