当前位置: 首页 > 知识库问答 >
问题:

在R中无NA强制的字符到数字的转换

韩豪
2023-03-14

我在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为什么会出现,以及如何摆脱它们,有什么想法吗?

共有1个答案

闾丘照
2023-03-14

正如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]。我很乐意帮