【问题标题】:remove degree symbol from numeric values in data frame从数据框中的数值中删除度数符号
【发布时间】:2015-02-18 14:57:55
【问题描述】:

我有一些 .csv 格式的温度测量值,并试图在 R 中对其进行分析。由于某种原因,数据文件包含温度,数值后有摄氏度。有没有办法删除摄氏度符号并返回数值?我虽然在这里制作了一个示例,但不知道如何在 R 中的字符串中生成度数符号。无论如何,这就是数据的样子:

> head(mm)
             dateTime Temperature
1 2009-04-23 17:01:00   15.115 °C
2 2009-04-23 17:11:00   15.165 °C
3 2009-04-23 17:21:00   15.183 °C

mm[,2] 的类是 'factor'

谁能建议将第二列转换为 15.115 等的方法?

【问题讨论】:

  • 你试过mm$temp <- as.numeric(mm$Temperature)吗?
  • 您可以尝试在读取数据时将° 设置为注释字符。否则,可以使用as.numeric(gsub(...))
  • @MarkusRehm 是的,它返回第一个值的 1299,这是不正确的
  • as.numeric(gsub("°C", "", "15.115 °C", fixed = TRUE))
  • 我打算提出一些更古怪的建议:对于温度列,运行gsub 删除所有不是数字或句点的内容:-)。 gsub('[^0-9.]','',mm$Temperature) -- 主要是因为我不记得如何在 R 中拉出“度”符号

标签: r


【解决方案1】:

您可以使用scan() 删除不需要的部分并将其余部分同时转换为数字。设置 flush = TRUE 将最后一个字段(在最后一个空格之后)视为注释并被丢弃(因为默认情况下sep 需要空格分隔符)。

mm <- read.table(text = "dateTime Temperature
1 '2009-04-23 17:01:00'  '15.115 °C'
2 '2009-04-23 17:11:00'   '15.165 °C'
3 '2009-04-23 17:21:00'   '15.183 °C'", header = TRUE)     

replace(mm, 2, scan(text = as.character(mm$Temp), flush = TRUE))
#              dateTime Temperature
# 1 2009-04-23 17:01:00      15.115
# 2 2009-04-23 17:11:00      15.165
# 3 2009-04-23 17:21:00      15.183

或者您可以使用 Unicode 通用类别来匹配度数符号的 Unicode 字符。

type.convert(sub("\\p{So}C", "", mm$Temp, perl = TRUE))
# [1] 15.115 15.165 15.183

这里,正则表达式\p{So} 匹配各种不是数学符号、货币符号或组合字符的符号。 C 按字面意思匹配字符 C(区分大小写)。 type.convert() 负责处理多余的空格。

【讨论】:

    【解决方案2】:

    如果所有温度值的位数相同,您可以使用左右函数(类似于 Excel 中的函数)来选择所需的位数。例如在另一个帖子的这个答案中:https://stackoverflow.com/a/26591121/4459730

    先做left函数:

    left = function (string,char){
    substr(string,1,char)
    }
    

    然后只使用您想要的数字重新创建温度字符串:

    mm$Temperature<-left(mm$Temperature,6)
    

    【讨论】:

    • 这似乎是解决问题的一种非常脆弱的方法。 cmets 中的正则表达式建议将更加健壮。
    • @Gregor True - 只是提供另一种选择。我发现左右函数对我从事的工作很有帮助。
    【解决方案3】:

    度数符号表示为\u00b0,因此下面的代码应该可以工作:

    df['Temperature'] = df['Temperature'].replace('\u00b0','', regex=True)
    

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      相关资源
      最近更新 更多