R 将字符(温度范围)转换为数字(列表)
我的数据框中有一个变量(名为otemp-class character),它包含以°C为单位的温度范围,我想将范围(例如-55°C~105°C)转换为数字(一个最小值和最大值的范围,例如-55:105),我可以稍后进行比较(大于、等于等) 以下是包含这些值的列: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"
> 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
frombase 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