R 将字符(温度范围)转换为数字(列表)

R 将字符(温度范围)转换为数字(列表),r,list,class,type-conversion,character,R,List,Class,Type Conversion,Character,我的数据框中有一个变量(名为otemp-class character),它包含以°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"

我的数据框中有一个变量(名为otemp-class character),它包含以°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"
首先,我去掉了摄氏度:

> otemp<- gsub('°C',"",otemp) head(otemp) [1] "-55 ~ 105" "-55 ~ 105"
> "-55 ~ 105" "-55 ~ 105" "-55 ~ 125" "-55 ~ 125"
>otemp“-55~105”“-55~105”“-55~125”“-55~125”
然后我将“~”替换为“:”

>otemp头(otemp)[1]“-55:105”“-55:105”“-55:105”“-55:105”“-55:125”“-55:125”

如何将当前类(字符)转换为一系列数字?(例如-55:105作为一个范围将导致一个从-55到105的数字范围)

我们可以使用
stru-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
from
base R

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

这是一种笨拙但非常透明的方法。移除摄氏度,按平铺分割,强制为数字矩阵。快乐舞蹈

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

x假设您想将min和max的值分成两个不同的列,我更喜欢
tidyr::separate(otemp,c(“min”,“max”),“:”)
谢谢您的回答@akrun!我已经尝试了str_extract_all with as numeric,但我希望它的范围是55到105(55:105)。上面的结果给了我两个无法理解为范围的独立值,它不允许我进行比较…@Kathia在这种情况下
unlist(sapply(str_extract\u all(otemp,[0-9.]+”,function(x)Reduce(“:”,as.numeric(x))
如果不需要单个向量,请将其作为
列表
lappy(str_extract_all
第一个很好,因为我想用numeric类将列保持为向量。你认为有没有可能获得这样的范围: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.]+”),粘贴,collapse=“:”
粘贴它,但是您必须执行
sapply(res,function(x)eval(parse(text=x)))
这不是我想要的方法recommend@akrun-向上投票,因为我同意你的观点,它不应该被向下投票@是的,我尝试了类似的东西,结果产生了两列:d[,c(“otmin”,“otmax”)]请编辑你的问题,以显示所需的输出应该是什么样子。字符串
-55:105
在R中不可用(但您可能有其他应用程序)。
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