我在R中工作,有一个带有数字向量的数据表dd_2006。当我第一次导入数据时,我需要从我的3个变量中删除$、小数点和一些空白:SumOfCost、SumOfCases和sumofunits。为此,我使用了str_replace_all
。但是,一旦我使用str_replace_all
,向量就会转换为字符。因此,我使用as.numeric(var)将向量转换为numeric,但引入了NAs,尽管在运行as.numeric代码之前运行下面的代码时,向量中没有NAs。
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
代码中的列#与我在这里发布的输出不匹配(但在原始代码中是这样):
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" ...
我在这里找到了一个与我类似的问题的响应,使用以下代码:
# 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中遇到了一些非常奇怪的东西,这不是最让人困惑的东西,但它会让你困惑,尤其是当你在睡觉前读到这篇文章时。
> 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:
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)
等查看观察结果,看看是否有我在观察结果中遗漏的字符,但没有。关于NAs为什么会出现,以及如何摆脱它们,有什么想法吗?
正如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,不如取出导致问题的记录并直接/单独地解决它们,直到NAs消失为止。
UPDATE:问题似乎出在对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
本文向大家介绍如何将R数据帧中的字符串转换为NA?,包括了如何将R数据帧中的字符串转换为NA?的使用技巧和注意事项,需要的朋友参考一下 我们经常会在数据收集过程中发现错误,这些错误可能会导致研究结果不正确。当错误地收集数据时,将使分析师的工作变得困难。显示数据有错误的一种情况是获取字符串代替数字值。因此,我们需要将这些字符串转换为R中的NA,以便我们可以进行预期的分析。 示例 请看以下数据帧- 将
我有一个像这样的数据框 由reprex包(v2.0.1)于2022-02-17创建 我想group_by col1,当count_col2 当count_col1 我希望我的数据看起来像这样 我不确定这是否可以通过变异(case_when…)来实现。到目前为止,我失败了
我正在从一个字符串列表中创建一个字符串数组。到目前为止,我有以下代码: 问题是toArray()返回的是Object[],而不是String[],后者在尝试转换为String[]时产生类转换异常。除了for循环之外,有没有一种简单的方法来实现我的目标,在for循环中,我将遍历Object[],将每个对象转换为一个字符串,然后将每个字符串添加到一个String[]?对一个简单的任务来说似乎有很多工作
问题内容: 我在HSQL数据库中有一个表,该表中有一个identity(integer)列。我想支持使用任意字符串(可能是非数字)对列进行查询。但是,HSQL JDBC驱动程序尝试将查询参数转换为整数并引发异常。Oracle驱动程序似乎可以很好地支持这种情况。 有什么想法可以在hsql驱动程序中更改此行为? org.hsqldb:hsqldb:2.3.0 桌子: 查询: 例外: 问题答案: 问题来
Golang具有strconv库,可以将字符串转换为int64和uint64。 但是,其余的整数数据类型似乎不受支持,因为我找不到byte、int16、uint16、int32、uint32数据类型的转换函数。 始终可以将字节、16位和32位数据类型转换为int64和uint64,而不会损失精度。这就是语言的意图吗?
我正在与返回JSON的Axios进行API调用。API将CUSIP返回为类型String,但是,我希望将其接收为类型Number。我创建了一个接口,它具有类型类型为数字,但是当我得到变量时,它仍然被视为字符串。 API调用和一些逻辑: 名为General的接口,其中我将CUSIP转换为数字: 问题是:不是将[CUSIP 1337]打印为[2 1337=1339],而是打印[21337]。我很乐意帮