【问题标题】:Convert character matrix into numeric matrix将字符矩阵转换为数值矩阵
【发布时间】:2014-01-14 12:36:21
【问题描述】:

我有一个名为 extra4 的 7 x 31 字符矩阵,它的结构如下所示:

> str(extra4)
 chr [1:7, 1:31] "36.88  " " 45.48  " " 52.46  " " 111.31 " " 138.45 " " 121.09 " " 122.62" ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:7] "1990" "1991" "1992" "1993" ...
  ..$ : chr [1:31] "1" "2" "3" "4" ...

在阅读了 SO 中的类似问题后,我尝试了以下方法,但失败了:

>matrix(as.numeric(unlist(extra4)),nrow=nrow(extra4))
Warning message:
In matrix(as.numeric(unlist(extra4)), nrow = nrow(extra4)) :
  NAs introduced by coercion

我也试过了

> class(extra4)<-"numeric"
Warning message:
In class(extra4) <- "numeric" : NAs introduced by coercion

> extra4<-apply(extra4, 1, as.numeric)
Warning messages:
1: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
2: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
3: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
4: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
5: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
6: In apply(extra4, 1, as.numeric) : NAs introduced by coercion
7: In apply(extra4, 1, as.numeric) : NAs introduced by coercion

> extra4<-apply(extra4, 2, as.numeric)
There were 31 warnings (use warnings() to see them)

我也尝试将矩阵更改为数据框,然后执行sapply(extra4, as.numeric),但这也不起作用,我也尝试将数据写入 csv,但不知何故,输出最终包含非数字字符。

这很奇怪,因为特别是在做了上述之后,只有一些数字变成了数值。但是,我确信所有元素都是字符,因为当我比较那些保存的和未保存的时,我得到了

> str(extra4[1,1])
 chr "36.88  "
> str(extra4[1,2])
 chr " 19.11  "

我还添加了以下内容以更详细地显示我的数据:

> dput(extra4)
structure(c("36.88  ", " 45.48  ", " 52.46  ", " 111.31 ", 
" 138.45 ", " 121.09 ", " 122.62", " 19.11  ", " 27.97  ", 
" 37.14  ", " 47.68  ", " 60.78  ", " 35.84  ", " 38.64", 
" 56.21  ", " 74.94  ", " 92.3   ", " 118.62 ", " 138.13 ", 
" 104.65 ", " 113.98", " 30.48  ", " 51.54  ", " 61.57  ", 
" 99.87  ", " 80.9   ", " 84.97  ", " 99.34", "20.16  ", 
" 24.76  ", " 27.76  ", " 37.53  ", " 50.53  ", " 28.8   ", 
" 25.06", " 87.73  ", " 98.68  ", " 119.95 ", " 150.74 ", 
" 214.35 ", " 118.5  ", " 129.19", " 32.36  ", " 36.52  ", 
" 42.67  ", " 56.55  ", " 89.22  ", " 49.97  ", " 50.62", 
"35.09  ", " 40.77  ", " 48.43  ", " 82.61  ", " 120.1  ", 
" 72.43  ", " 76.69", " 47.21  ", " 67.25  ", " 78.62  ", 
" 66.64  ", " 83.78  ", " 127.79 ", " 154.11", " 86.1   ", 
" 127.59 ", " 164.43 ", " 249.32 ", " 312.01 ", " 272.09 ", 
" 265.68", " 83.75  ", " 118.41 ", " 171.52 ", " 229.27 ", 
" 241.63 ", " 201    ", " 213.01", " 36.63  ", " 52.1   ", 
" 66.03  ", " 101.38 ", " 126.71 ", " 95.46  ", " 110.03", 
" 57.5   ", " 75.72  ", " 101.31 ", " 147.5  ", " 171.01 ", 
" 148.66 ", " 167.93", " 29.56  ", " 38.37  ", " 48.8   ", 
" 65.5   ", " 84.77  ", " 75.2   ", " 81.27", " 77.28  ", 
" 93.7   ", " 119.62 ", " 247    ", " 301.76 ", 
" 222.52 ", " 244.46", " 45.6   ", " 54.32  ", " 87.81  ", 
" 132.93 ", " 163.62 ", " 152.99 ", " 170.85", " 27.13  ", 
" 36.96  ", " 48.94  ", " 80.01  ", " 124.07 ", " 93.49  ", 
" 105.57", " 54.55  ", " 85.93  ", " 102.3  ", " 122.7  ", 
" 168.36 ", " 151.79 ", " 169.65", " 86.19  ", " 121.82 ", 
" 191.7  ", " 247.75 ", " 260.23 ", " 196.48 ", " 243.06", 
"47.35  ", " 60.63  ", " 76.4   ", " 93.04  ", " 102.13 ", 
" 98.29  ", " 86.27", " 10.93  ", " 13.33  ", " 16.82  ", 
" 18.2   ", " 23.48  ", " 16.52  ", " 16.19", "   NA   ", 
"  NA    ", "   NA   ", "  NA    ", " 69.46  ", 
" 54.22  ", " 60.16", " 60.93  ", " 89.86  ", " 141.85 ", 
" 207.9  ", " 182.79 ", " 159.1  ", " 159.46", " 15.37  ", 
" 18.48  ", " 24.33  ", " 38.37  ", " 45.87  ", " 34.86  ", 
" 31.96", " 34.05  ", " 40.1   ", " 55.02  ", " 58.31  ", 
" 86.89  ", " 65.68  ", " 65.68", "1.51   ", " 0.93   ", 
" 1      ", " 1.78   ", " 2.8    ", " 1.56   ", 
" 1.41", " 27.15  ", " 31.37  ", " 39.46  ", " 40.33  ", 
" 61.86  ", " 45.18  ", " 57.71", " 14.74  ", " 16.3   ", 
" 25.06  ", " 31.74  ", " 37.39  ", " 27.18  ", " 30.49", 
" 3.59   ", " 4.86   ", " 5.67   ", " 6.36   ", 
" 7.6    ", " 4.8    ", " 5.5", "4.73   ", " 5.68   ", 
" 7.3    ", " 8.53   ", " 11.03  ", " 8.44   ", 
" 9.84", "16.76  ", " 24.83  ", " 32.66  ", " 46.22  ", 
" 48.01  ", " 43.44  ", " 48.29"), .Dim = c(7L, 31L), .Dimnames = list(
    c("1990", "1991", "1992", "1993", "1994", "1995", "1996"), 
    c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", 
    "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", 
    "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"
    )))

sessionInfo() 给出了以下内容:

    > sessionInfo()
R version 3.0.0 (2013-04-03)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] gdata_2.13.2

loaded via a namespace (and not attached):
[1] gtools_2.7.1 tools_3.0.0 

【问题讨论】:

  • 你希望sapply(extra4, as.numeric()) 做什么?
  • 把extra4中的所有向量转成数字?
  • 我不知道额外的空格是如何出现在您的数据中的,或者您是否在某个阶段使用read.table 来读取“损坏的”数据。无论如何,我只是想提醒您read.table 中的strip.white 参数。
  • @Henrik 我会调查一下,谢谢。我也不明白,因为我回顾了一下excel文件,它看起来很好。我使用了 read.xls。
  • 我认为您可以在read.xls 中使用read.table 参数。并且:您所看到的不是您在 Excel 文件中获得的...

标签: r matrix


【解决方案1】:

最简单的基础 R 方法是:

m <- matrix(data = c("1","2","3","4","5","6"), ncol = 2, nrow = 3)

m <- apply(m, 2 ,as.numeric)

【讨论】:

    【解决方案2】:
    m <- matrix(data = c("1","2","3","4","5","6"), ncol = 2, nrow = 3)
    
    class(m) <- "numeric"
    

    【讨论】:

    • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
    • 这是一个大脑洞,马修斯。 @Tyler2P 每个 R 对象都有一个影响其行为方式的类。它所做的是更改对象的类,而无需重新计算任何东西。通过这样做,表示从字符转换为数字。太棒了。
    【解决方案3】:

    我认为你可以申请:

    data.matrix(frame, rownames.force = NA)
    

    这里有更多信息:https://stat.ethz.ch/R-manual/R-devel/library/base/html/data.matrix.html

    【讨论】:

    • 我喜欢这个解决方案的直接性质!
    • 很棒的答案。
    【解决方案4】:

    这里根本没有问题,我尝试过的大多数选项都没有。您收到 Warnings 但这些与 "NA" 字符串有关,因为它们不是 NA 也不是存储在字符串中的数字,R 不知道如何处理它们并进行更改这些给NA。这就是警告告诉你的全部内容。因此

    apply(extra4, 2, as.numeric)
    sapply(extra4, as.numeric)
    class(extra4) <- "numeric"
    storage.mode(extra4) <- "numeric"
    

    extra4 的第 22 列中的“NA”值(或其变体)所有工作和所有警告:

    Warning message:
    In storage.mode(m) <- "numeric" : NAs introduced by coercion
    

    但这些只是警告,在这种情况下可以忽略。如果他们给您带来麻烦,您可以将电话转入suppressWarnings()

    > suppressWarnings(storage.mode(m) <- "numeric")
    

    但这很危险,因为它会停止所有警告,而不仅仅是关于 NAs 的警告。

    【讨论】:

    • 谢谢!我认为您提到的是转换角色时的问题。但是我收到类似的错误“警告消息:在 storage.mode(extra4)
    • @Rusuer9000 然后还有一些关于您的数据的其他内容,我们无法从您显示的 sn-p 中看到 - 我将您显示的 7 个值读入 R 并且我显示的代码有效。您可以编辑您的问题并包含dput(extra4) 的输出吗?这样我们就可以准确地重新创建您拥有的对象?
    • 我添加了“dput(extra4)”。我认为问题正在发生,因为每个元素的空间在所有元素中都不相同。例如,有些可以是“4”,但有些可以是“5”。
    • @Rusuer9000 谢谢,你想要的是gsub() 而不是sub()。会更新答案
    • 这里不需要subgsub。命令storage.mode(m) &lt;- "numeric" 就足够了。
    【解决方案5】:

    如果你有一个字符矩阵m,即

    m <- matrix(data = c("1","2","3","4","5","6"), ncol = 2, nrow = 3)
    

    简单地映射为.numeric,即

    m <- mapply(m, FUN=as.numeric)
    

    并用数据重构出与原m矩阵维数相同的矩阵,即

    m <- matrix(data=m, ncol=2, nrow=3)
    

    【讨论】:

    • 我认为使用mapply 不是一个好习惯,除非您实际上有多个参数。
    • @C8H10N4O2 有什么缺点?我认为我的解决方案可能更优雅 TBH
    • 只需使用sapply,因为您的函数只有一个参数。 mapply M 用于多个参数。因此,您只是采用了现有答案并为其使用了错误的功能。 -1
    • 我的错误,我认为 m 是矩阵,类似于 lapply 中的 l(即列表)。仅供参考,我没有从上一个答案中得到答案,我只是认为 mapply 是更好的功能。在单参数情况下使用 mapply 是否存在性能问题?它会增加不必要的计算复杂性还是只是一次迭代?你知道是否有任何真正的区别,即为什么这是不好的做法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    相关资源
    最近更新 更多