【发布时间】:2013-07-09 23:58:30
【问题描述】:
我在 R 中工作,有一个数据框 dd_2006,带有数字向量。当我第一次导入数据时,我需要从我的三个变量中删除 $、小数点和一些空格:SumOfCost、SumOfCases 和 SumOfUnits。为此,我使用了str_replace_all。但是,一旦我使用了str_replace_all,向量就会被转换为字符。所以我使用 as.numeric(var) 将向量转换为数字,但是引入了 NA,即使在我运行 as.numeric 代码之前运行下面的代码时,向量中也没有 NA。
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 在他的回复中创建的字符变量的相似性。它实际上是一个转换为字符的数值向量。第 3 和第 4 列是因子,最后一列是“纯”数字。
如果你使用转换函数,你可以将 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:
transform(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
所以我在我的脚本中尝试了上面的代码,但仍然想出了 NA(没有关于强制的警告消息)。
#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) 等来查看观察结果,看看我在观察结果中是否遗漏了任何字符,但没有。关于为什么会出现 NA 以及如何摆脱它们的任何想法?
【问题讨论】:
-
抱歉,请问有什么问题?链接的答案似乎很好地总结了所有内容,并且没有 you 实际面临的问题的可重现示例,我不确定其他人如何提供帮助....
-
我猜这些数据来自 Excel 或其他电子表格。下次,请在导出前清除所有格式。
标签: r vector character numeric na