【问题标题】:Convert characters (range of temperature) to numbers (lists)将字符(温度范围)转换为数字(列表)
【发布时间】:2018-01-19 18:33:58
【问题描述】:

我的数据框中有一个变量(名为 otemp - 类字符),其中包含以°C 为单位的温度范围,我想将范围(例如 -55°C ~ 105°C)转换为数字(范围有一个最小值和最大值,例如-55:105)我可以稍后比较(大于、等于等)。

这是包含这些值的列:

> head(otemp)  
[1] "-55°C ~ 105°C" "-55°C ~ 105°C" "-55°C ~ 105°C" "-55°C ~ 105°C" "-55°C ~ 125°C" "-55°C ~ 125°C"

首先,我删除了°C:

> otemp<- gsub('°C',"",otemp) head(otemp) [1] "-55 ~ 105" "-55 ~ 105"
> "-55 ~ 105" "-55 ~ 105" "-55 ~ 125" "-55 ~ 125"

然后我把“~”换成了“:”

> otemp <- gsub('~',":",otemp)
> head(otemp) [1] "-55 : 105" "-55 : 105" "-55 : 105" "-55 : 105" "-55 : 125" "-55 : 125"

如何将当前类(字符)转换为数字范围? (例如,-55:105 作为范围将产生从 -55 到 105 的数字范围)

【问题讨论】:

  • 假设您想将 min 和 max 的值分成两个不同的列,我更喜欢 tidyr::separate(otemp, c("min", "max"), " : ")

标签: r list class type-conversion character


【解决方案1】:

我们可以使用str_extract

library(stringr)
as.numeric(unlist( str_extract_all(otemp, "[0-9.]+")))
#[1]  55 105  55 105  55 105  55 105  55 125  55 125

或与gregexpr/regmatches 来自base R

as.numeric(unlist(regmatches(otemp, gregexpr("[0-9.]+", otemp))))

【讨论】:

  • 感谢您的回答@akrun!我尝试将 str_extract_all 设为数字,但我希望它的范围为 55 到 105 (55:105)。上面的结果给了我两个不能理解为范围的单独值,它不允许我进行比较......
  • @Kathia 在这种情况下unlist(sapply(str_extract_all(otemp, "[0-9.]+"), function(x) Reduce(":", as.numeric(x)))) 如果您不需要单个向量,请将其保留为listlapply(str_extract_all
  • 第一个很好,因为我想将该列保留为带有数字类的向量。你认为有没有可能获得这样写的范围:55:105、55:105、55:105、55:105、55:125、55:125?我试过这个: eval(parse(text = paste("c(", gsub("\\~", ":", otemp), ")"))) 但它显示了 55 到 105 之间的所有数字只是以一系列数字的形式写出来:55:105
  • @Kathia 你可以用sapply(str_extract_all(otemp, "[0-9.]+"), paste, collapse=":") 粘贴它,但你必须这样做sapply(res, function(x) eval(parse(text= x))) 这不是我推荐的方法
  • @akrun - 赞成,因为我同意你的观点,它不应该被反对
【解决方案2】:

这是一种笨拙但非常透明的方法。删除摄氏度,用波浪号分割,强制转换为数字矩阵。快乐的舞蹈

x <- c("-55°C ~ 105°C", "-55°C ~ 105°C", "-55°C ~ 105°C", "-55°C ~ 105°C", "-55°C ~ 125°C", "-55°C ~ 125°C")
x <- gsub("°C", "", x)
x <- strsplit(x, "~")
x <- sapply(x, as.numeric)
t(x)

     [,1] [,2]
[1,]  -55  105
[2,]  -55  105
[3,]  -55  105
[4,]  -55  105
[5,]  -55  125
[6,]  -55  125

【讨论】:

  • @ 是的,我尝试过类似的方法,导致两列:d[,c("otmin","otmax")]
  • 请编辑您的问题以显示所需输出的外观。字符串 -55 : 105 在 R 中不可用(但您可能有其他应用程序)。
猜你喜欢
  • 1970-01-01
  • 2012-04-08
  • 2017-10-02
  • 1970-01-01
  • 2011-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多