在R中没有NA强制将字符转换为数字

前端之家收集整理的这篇文章主要介绍了在R中没有NA强制将字符转换为数字前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在R中工作并且有一个带有数字向量的数据帧dd_2006.当我第一次导入数据时,我需要从3个变量中删除$,小数点和一些空格:SumOfCost,SumOfCases和SumOfUnits.为此,我使用了str_replace_all.但是,一旦我使用str_replace_all,矢量就被转换为字符.所以我使用as.numeric(var)将向量转换为数字,但引入了NAs,即使我在运行as.numeric代码之前运行下面的代码时,向量中也没有NA.
  1. sum(is.na(dd_2006$SumOfCost))
  2. [1] 0
  3. sum(is.na(dd_2006$SumOfCases))
  4. [1] 0
  5. sum(is.na(dd_2006$SumOfUnits))
  6. [1] 0

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

  1. library("stringr")
  2. dd_2006$SumOfCost <- str_sub(dd_2006$SumOfCost,2,) #2=the first # after the $
  3.  
  4. #Removes decimal pt,zero's after,and commas
  5. dd_2006[,9] <- str_replace_all(dd_2006[,9],".00","")
  6. dd_2006[,","")
  7.  
  8. dd_2006[,10] <- str_replace_all(dd_2006[,10],11] <- str_replace_all(dd_2006[,11],"")
  9.  
  10. str(dd_2006)
  11. 'data.frame': 12604 obs. of 14 variables:
  12. $CMHSP : Factor w/ 46 levels "Allegan","AuSable Valley",..: 1 1 1
  13. $FY : Factor w/ 1 level "2006": 1 1 1 1 1 1 1 1 1 1 ...
  14. $Population : Factor w/ 1 level "DD": 1 1 1 1 1 1 1 1 1 1 ...
  15. $SumOfCases : chr "0" "1" "0" "0" ...
  16. $SumOfUnits : chr "0" "365" "0" "0" ...
  17. $SumOfCost : chr "0" "96416" "0" "0" ...

我使用以下代码找到了对我的here类似问题的回复

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

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

让我们运行:

  1. > sapply(d,mode)
  2. char fake_char fac char_fac num
  3. "character" "character" "numeric" "numeric" "numeric"
  4. > sapply(d,class)
  5. char fake_char fac char_fac num
  6. "character" "character" "factor" "factor" "integer"

现在你可能会问自己“哪里有异常?”好吧,我在R中碰到了很多奇怪的东西,这不是最令人困惑的东西,但它会让你感到困惑,特别是如果你在睡觉前读到这个.

这里说:前两列是字符.我故意称第二个为fake_char.发现这个角色变量与Dirk在回复中创建的变量的相似性.它实际上是一个转换为字符的数字向量.第3列和第4列是因子,最后一列是“纯粹”数字.

如果使用transform函数,则可以将fake_char转换为numeric,但不能转换为char变量本身.

  1. > transform(d,char = as.numeric(char))
  2. char fake_char fac char_fac num
  3. 1 NA 1 1 a 1
  4. 2 NA 2 2 b 2
  5. 3 NA 3 3 c 3
  6. 4 NA 4 4 d 4
  7. 5 NA 5 5 e 5
  8. Warning message:
  9. In eval(expr,envir,enclos) : NAs introduced by coercion
  10. but if you do same thing on fake_char and char_fac,you'll be lucky,and get away with no NA's:

transform(d,fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))

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

所以我在我的脚本中尝试了上面的代码,但仍然提出了NA(没有关于强制的警告消息).

  1. #changing sumofcases,cost,and units to numeric
  2. dd_2006_1 <- transform(dd_2006,SumOfCases = as.numeric(SumOfCases),SumOfUnits = as.numeric(SumOfUnits),SumOfCost = as.numeric(SumOfCost))
  3.  
  4. > sum(is.na(dd_2006_1$SumOfCost))
  5. [1] 12
  6. > sum(is.na(dd_2006_1$SumOfCases))
  7. [1] 7
  8. > sum(is.na(dd_2006_1$SumOfUnits))
  9. [1] 11

我还使用表(dd_2006 $SumOfCases)等来查看观察结果,看看是否有任何我在观察中遗漏的字符,但没有任何字符.有关为什么会出现这些新闻的想法,以及如何摆脱它们?

解决方法

正如Anando指出的那样,问题出现在您的数据中,如果没有可重复的示例,我们就无法帮助您.也就是说,这是一个代码片段,可以帮助您确定数据中导致问题的记录:
  1. test = as.character(c(1,3,4,'M'))
  2. v = as.numeric(test) # NAs intorduced by coercion
  3. ix.na = is.na(v)
  4. which(ix.na) # row index of our problem = 5
  5. test[ix.na] # shows the problematic record,"M"

而不是猜测为什么引入NAs,而是拉出导致问题的记录并直接/单独地解决它们,直到NA消失为止.

更新:看起来问题在于你对str_replace_all的调用.我不知道stringr库,但我认为你可以用gsub完成同样的事情:

  1. v2 = c("1.00","2.00","3.00")
  2. gsub("\\.00","",v2)
  3.  
  4. [1] "1" "2" "3"

我不完全确定这会完成什么:

  1. sum(as.numeric(v2)!=as.numeric(gsub("\\.00",v2))) # Illustrate that vectors are equivalent.
  2.  
  3. [1] 0

除非这为您实现某些特定目的,否则我建议完全从预处理中删除此步骤,因为它似乎没有必要,似乎给您带来了问题.

猜你在找的Java相关文章