2013-07-11 22 views
6

我正在R中工作,并且有数据框dd_2006和数字向量。当我第一次导入数据时,我需要从我的三个变量中删除$的小数点和一些空格:SumOfCost,SumOfCases和SumOfUnits。要做到这一点,我使用了str_replace_all。但是,一旦我使用str_replace_all,矢量被转换为字符。因此,我使用as.numeric(var)将矢量转换为数字,但引入了NAs,即使在运行as.numeric代码之前运行下面的代码时,向量中也没有NAs。在R中将字符转换为无数字强制的数字

sum(is.na(dd_2006$SumOfCost)) 
[1] 0 
sum(is.na(dd_2006$SumOfCases)) 
[1] 0 
sum(is.na(dd_2006$SumOfUnits)) 
[1] 0 

这是我的代码从导入后,从移除向量的$开始。在str(dd_2006)输出中,为了空间的原因,我删除了一些变量,因此下面str_replace_all代码中的列#s与我在此处发布的输出不匹配(但它们是在原始代码中执行的):

library("stringr") 
dd_2006$SumOfCost <- str_sub(dd_2006$SumOfCost, 2,) #2=the first # after the $ 

#Removes decimal pt, zero's after, and commas 
dd_2006[ ,9] <- str_replace_all(dd_2006[ ,9], ".00", "") 
dd_2006[,9] <- str_replace_all(dd_2006[,9], ",", "") 

dd_2006[ ,10] <- str_replace_all(dd_2006[ ,10], ".00", "") 
dd_2006[ ,10] <- str_replace_all(dd_2006[,10], ",", "") 

dd_2006[ ,11] <- str_replace_all(dd_2006[ ,11], ".00", "") 
dd_2006[,11] <- str_replace_all(dd_2006[,11], ",", "") 

str(dd_2006) 
'data.frame': 12604 obs. of 14 variables: 
$ CMHSP      : Factor w/ 46 levels "Allegan","AuSable Valley",..: 1 1 1 
$ FY      : Factor w/ 1 level "2006": 1 1 1 1 1 1 1 1 1 1 ... 
$ Population    : Factor w/ 1 level "DD": 1 1 1 1 1 1 1 1 1 1 ... 
$ SumOfCases    : chr "0" "1" "0" "0" ... 
$ SumOfUnits    : chr "0" "365" "0" "0" ... 
$ SumOfCost     : chr "0" "96416" "0" "0" ... 

,我发现类似的问题的响应来挖掘here,使用下面的代码:

# create dummy data.frame 
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) 

让我们在data.frame一目了然

> d 
    char fake_char fac char_fac num 
1 a   1 1  a 1 
2 b   2 2  b 2 
3 c   3 3  c 3 
4 d   4 4  d 4 
5 e   5 5  e 5 

让我们运行:

> sapply(d, mode) 
     char fake_char   fac char_fac   num 
"character" "character" "numeric" "numeric" "numeric" 
> sapply(d, class) 
     char fake_char   fac char_fac   num 
"character" "character" "factor" "factor" "integer" 

现在你可能会问自己:“哪里出现异常?”好吧,我在R中碰到了很奇怪的东西,这并不是最混乱的东西,但它可能会让你困惑,尤其是如果你在躺在床上之前阅读它。

这里是:前两列是字符。我故意叫第二个fake_char。找出这个字符变量与Dirk在他的回复中创建的变量的相似性。它实际上是一个转换为字符的数字向量。第三和第四列是因子,最后一列是“纯粹”数字。

如果您使用转换函数,您可以将fake_char转换为数字,但不是char变量本身。

> 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 
but if you do same thing on fake_char and char_fac, you'll be lucky, and get away with no NA's: 

变换(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 

于是,我在我的脚本上述代码,但仍然拿出新生(没有关于强制的警告信息)。

#changing sumofcases, cost, and units to numeric 
dd_2006_1 <- transform(dd_2006, SumOfCases = as.numeric(SumOfCases), SumOfUnits = as.numeric(SumOfUnits), SumOfCost = as.numeric(SumOfCost)) 

> sum(is.na(dd_2006_1$SumOfCost)) 
[1] 12 
> sum(is.na(dd_2006_1$SumOfCases)) 
[1] 7 
> sum(is.na(dd_2006_1$SumOfUnits)) 
[1] 11 

我也用table(dd_2006$SumOfCases)等等看的意见,看看是否有我的看法错过任何字符,但没有发现任何。关于为什么新生儿出现,以及如何摆脱他们的任何想法?

+2

对不起,但是什么问题?链接的答案似乎总结一切都很好,没有一个可重现的问题的例子*你真的正在面对,我不知道其他人可以如何帮助.... – A5C1D2H2I1M1N2O1R2T1

+0

我猜这些数据来自Excel或另一个电子表格。下一次,请在导出之前清除所有格式。 –

回答

10

正如Anando指出的那样,问题出在您的数据中,如果没有可重复的例子,我们无法真正帮助您。这就是说,这里的代码片段,帮助你拖住你的数据是造成你的问题记录:

test = as.character(c(1,2,3,4,'M')) 
v = as.numeric(test) # NAs intorduced by coercion 
ix.na = is.na(v) 
which(ix.na) # row index of our problem = 5 
test[ix.na] # shows the problematic record, "M" 

而不是猜测,为什么被引进来港的,拔出所导致问题的记录并直接/单独地解决它们,直到NAs消失。

更新:看起来问题在于您拨打str_replace_all。我不知道stringr库,但我认为你可以做到同样的事情gsub这样的:

v2 = c("1.00","2.00","3.00") 
gsub("\\.00", "", v2) 

[1] "1" "2" "3" 

我不完全知道这是什么,虽然完成:

sum(as.numeric(v2)!=as.numeric(gsub("\\.00", "", v2))) # Illustrate that vectors are equivalent. 

[1] 0 

除非本为你达到一些特定的目的,我建议完全从你的预处理中放弃这一步,因为它看起来没有必要,似乎给你带来了问题。

+0

当我运行SumOfUnits的代码时,我得到了问题NAs [1]的哪个(ix.na)#row索引1098 2297 4728 5559 5592 5702 6955 8191 10517 10881 10955 > test [ix.na]#[但是当我查看原始数据集中的那些行时,它看起来像这样: 'SumOfUnits 800.00 0.00 100.00 100.00 100.00 300.00 400.00 200.00 200.00 600.00 100.00' 因此,如何是一个亲当我运行'str_replace_all'代码时,会发生数据瑕疵? – idemanalyst

+0

看起来像你固定的问题。我真的不知道预处理这些字符串是如何完成的,因为您可以将这些值简单地转换为带有或不带小数的数字,但我会在更新后的答案中演示使用'gsub'的替代解决方案。 –

+0

就是这样,谢谢! – idemanalyst

4

如果要将字符转换为数字,则首先将其转换为一个因子(使用as.factor)并保存/覆盖现有变量。接下来将此因子变量转换为数字(使用as.numeric)。您不会以这种方式创建NAs,并且可以将您拥有的数据集转换为数字。

+0

as.numeric(as.factor(df $ x))只是用1和2替换值,索引 –

相关问题