【问题标题】:str_split on first and second occurence of delimter at different locations in character vectorstrsplit 在字符向量中的不同位置第一次和第二次出现分隔符
【发布时间】:2018-06-15 13:01:36
【问题描述】:

我有一个字符列表,其中包含天气变量,后跟“mean_#”,其中 # 是 5 到 10 之间的数字。我想将列表子集化为只有天气变量名称本身。平均天气变量如下所示:

> mean_vars
 [1] "dew_mean_10"        "dew_mean_5"         "dew_mean_6"         "dew_mean_7"        
 [5] "dew_mean_8"         "dew_mean_9"         "humid_mean_10"      "humid_mean_5"      
 [9] "humid_mean_6"       "humid_mean_7"       "humid_mean_8"       "humid_mean_9"      
[13] "rain_mean_10"       "rain_mean_5"        "rain_mean_6"        "rain_mean_7"       
[17] "rain_mean_8"        "rain_mean_9"        "soil_moist_mean_10" "soil_moist_mean_5" 
[21] "soil_moist_mean_6"  "soil_moist_mean_7"  "soil_moist_mean_8"  "soil_moist_mean_9" 
[25] "soil_temp_mean_10"  "soil_temp_mean_5"   "soil_temp_mean_6"   "soil_temp_mean_7"  
[29] "soil_temp_mean_8"   "soil_temp_mean_9"   "solar_mean_10"      "solar_mean_5"      
[33] "solar_mean_6"       "solar_mean_7"       "solar_mean_8"       "solar_mean_9"      
[37] "temp_mean_10"       "temp_mean_5"        "temp_mean_6"        "temp_mean_7"       
[41] "temp_mean_8"        "temp_mean_9"        "wind_dir_mean_10"   "wind_dir_mean_5"   
[45] "wind_dir_mean_6"    "wind_dir_mean_7"    "wind_dir_mean_8"    "wind_dir_mean_9"   
[49] "wind_gust_mean_10"  "wind_gust_mean_5"   "wind_gust_mean_6"   "wind_gust_mean_7"  
[53] "wind_gust_mean_8"   "wind_gust_mean_9"   "wind_spd_mean_10"   "wind_spd_mean_5"   
[57] "wind_spd_mean_6"    "wind_spd_mean_7"    "wind_spd_mean_8"    "wind_spd_mean_9"

这就是我最后想要的:

> var_names                                                                                           
       "dew"      "humid"       "rain"      "solar"       "temp" "soil_moist"  "soil_temp"    "wind_dir"  "wind_gust"   "wind_spd" 

现在我想出了如何做到这一点,但由于缺乏正则表达式的能力,我的方法是多余的。我还必须重复我的过程 20 次,用其他词代替“平均”。

var_names <- unique(str_split_fixed(mean_vars, "_", n = 3)[c(1:18,31:42),1])
var_names <- unlist(c(var_names, unique(unite(as_tibble(str_split_fixed(mean_vars, "_", n = 3)[c(19:30,43:60), 1:2])))))

我一直试图尽可能地保持在 tidyverse 包的范围内,所以我使用了 stringr::str_split_fixed。

如果您有一个使用相同功能的解决方案,那将是理想的,因为我可以继续相同的编程风格,但我愿意接受所有建议。

谢谢。

【问题讨论】:

标签: r regex stringr


【解决方案1】:

使用subunique。这更短并且没有包依赖(或使用 unique(str_replace(mean_vars, "_mean.*", "")) 和 stringr):

unique(sub("_mean.*", "", mean_vars))

给予:

 [1] "dew"        "humid"      "rain"       "soil_moist" "soil_temp" 
 [6] "solar"      "temp"       "wind_dir"   "wind_gust"  "wind_spd"  

如果出于某种原因你真的想使用str_split 那么:

rmMean <- function(x) paste(head(x, -2), collapse = "_")
unique(sapply(str_split(mean_vars, "_"), rmMean))

注意

mean_vars <- c("dew_mean_10", "dew_mean_5", "dew_mean_6", "dew_mean_7", "dew_mean_8", 
"dew_mean_9", "humid_mean_10", "humid_mean_5", "humid_mean_6", 
"humid_mean_7", "humid_mean_8", "humid_mean_9", "rain_mean_10", 
"rain_mean_5", "rain_mean_6", "rain_mean_7", "rain_mean_8", "rain_mean_9", 
"soil_moist_mean_10", "soil_moist_mean_5", "soil_moist_mean_6", 
"soil_moist_mean_7", "soil_moist_mean_8", "soil_moist_mean_9", 
"soil_temp_mean_10", "soil_temp_mean_5", "soil_temp_mean_6", 
"soil_temp_mean_7", "soil_temp_mean_8", "soil_temp_mean_9", "solar_mean_10", 
"solar_mean_5", "solar_mean_6", "solar_mean_7", "solar_mean_8", 
"solar_mean_9", "temp_mean_10", "temp_mean_5", "temp_mean_6", 
"temp_mean_7", "temp_mean_8", "temp_mean_9", "wind_dir_mean_10", 
"wind_dir_mean_5", "wind_dir_mean_6", "wind_dir_mean_7", "wind_dir_mean_8", 
"wind_dir_mean_9", "wind_gust_mean_10", "wind_gust_mean_5", "wind_gust_mean_6", 
"wind_gust_mean_7", "wind_gust_mean_8", "wind_gust_mean_9", "wind_spd_mean_10", 
"wind_spd_mean_5", "wind_spd_mean_6", "wind_spd_mean_7", "wind_spd_mean_8", 
"wind_spd_mean_9")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2018-02-05
    • 2017-09-08
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多