【问题标题】:Converting excel output from character to numeric in R在R中将excel输出从字符转换为数字
【发布时间】:2013-01-19 04:09:52
【问题描述】:

我有问题。假设我有一个向量 x:

x:

 [1] "2 416" "143"   "280"   "2 503" "144"   "128"   "55"    "697"   "826"   "9"     "35"    "9 257" "234"   "2 044" NA      "219"  
[17] NA      NA      "219"   "7 431" "82"    "88"    "186"   "231"   "192"   "456"   "585"   "75"    "142"   NA      NA      NA     
[33] "72"    "246"   "900"   "143"   "231"   "195"   "282"   "226"   "967"   "247"   "2 252" "694"   "64"    "7 744" "204"   "428"  
[49] "19"    "94"    "174"   "292"   "94"    "172"   "221"   "123"   "404"   "385"   "324"   "346"   "658"   "53"    "377"   "119"  
[65] NA      "51"    "391"   "1 072" "387"   "1 742" "518"   "173"   "366"   "67"    "163"   "1 151" "382"   "864"   "184"   "172"  
[81] NA      "538"   "39"    "2 272" "334"   "464"   "82"    "112" 

class(x) 
"character" 

我从 Excel 导入了这个向量

x=read.csv(file="C:/Users/Documents/x.csv",header=TRUE,sep=";",na.strings=c("NA",""),
dec = ",",stringsAsFactors=FALSE,blank.lines.skip = F)

不,当我尝试将 x 转换为数字时,会发生这种情况:

as.numeric(x)

 [1]  NA 143 280  NA 144 128  55 697 826   9  35  NA 234  NA  NA 219  NA  NA 219  NA  82  88 186 231 192 456 585  75 142  NA  NA  NA  72
[34] 246 900 143 231 195 282 226 967 247  NA 694  64  NA 204 428  19  94 174 292  94 172 221 123 404 385 324 346 658  53 377 119  NA  51
[67] 391  NA 387  NA 518 173 366  67 163  NA 382 864 184 172  NA 538  39  NA 334 464  82 112
Warning message:
NAs introduced by coercion 

所以一些数字,即“2 416”转换为NA,而我希望将数字转换为2 416。我希望R将"2 416"解释为数值2416我做错了什么?

最好的问候

【问题讨论】:

  • 空间导致问题。 '2 416' 是两个分开的不同数字,还是与 '2416' 相同(无空格)?
  • @Dinre 是同一个号码。我希望 R 将“2 416”解释为数值。第2416章
  • 或者您可以简单地更改 Excel 中的数字格式 ...
  • @user1665355 很难解释,因为我的 Excel 版本是本地化的。但是,如果您右键单击选定的单元格,则应该有一个菜单点format cells,您可以在其中更改数字格式。
  • 谢谢,我想我找到了:)

标签: r excel import


【解决方案1】:

在进行转换之前,您必须用空字符串替换空格:

x <- c("2 416", "143", "280", "2 503")

立即转换失败,因为“2 416”不是数字:

as.numeric(x)
[1]  NA 143 280  NA
Warning message:
NAs introduced by coercion 

使用gsub()将空格替换为空字符串,然后进行转换:

as.numeric(gsub(" ", "", x))
[1] 2416  143  280 2503

【讨论】:

  • 你打败了我。正则表达式万岁!
  • @Andrie 我怎样才能很好地将它应用到 data.frame 中的多个列?我想到了类似 lapply 的东西,然后将结果列表转换为 data.frame 并用它替换我的数据框中的列:)
  • 是的,lapply 是一种选择。
  • @user1317221_G 在数据框上使用apply 是非常危险的。它会将您的数据框强制转换为数组。如果这是意图,那很好,但如果你有混合类,包括因素,你最终会遇到无数的问题
  • @user1317221_G 很好,我会使用你的解决方案。它比我的更快:mm=lapply(8:ncol(data),function(x) as.numeric(gsub(" ", "", data[,x]))); mm=as.data.frame(do.call("cbind",mm)); data[,8:ncol(data)]=mm
【解决方案2】:

使用stringr

你可以做类似的事情

library(stringr)
> as.numeric(str_replace_all(dat,pattern=' ',replacement=''))
 [1] 2416  143  280 2503  144  128   55  697  826    9   35 9257  234 2044   NA  219   NA   NA  219 7431   82   88  186  231  192  456  585   75  142
[30]   NA   NA   NA   72  246  900  143  231  195  282  226  967  247 2252  694   64 7744  204  428   19   94  174  292   94  172  221  123  404  385
[59]  324  346  658   53  377  119   NA   51  391 1072  387 1742  518  173  366   67  163 1151  382  864  184  172   NA  538   39 2272  334  464   82
[88]  112

【讨论】:

    猜你喜欢
    • 2021-02-26
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2022-01-08
    • 2014-05-11
    • 2011-11-28
    相关资源
    最近更新 更多