我需要将凌乱的因素转换为数字。示例数据如下所示:
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
答案 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
被指示阅读bytes
时grepl("[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);
}
进行因子转换可能是一种安全的方法,可以自行使用,而无需先检查有问题的值。