簡體   English   中英

R中字符的刪除、拆分和重新排序

[英]Removing and splitting and reordering of characters in R

我有一個包含這些值列的數據框。 我想將它們拆分為向量並根據內部值根據星期一->星期日重新排列它們。 有沒有辦法做到這一點? 我嘗試使用 str_split (column_name,",") 但它不會拆分字符串。

c("[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Sunday,Thursday,Tuesday,Saturday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Saturday,Monday,Thursday,Tuesday,Friday]")

一個基本的 R 解決方案 -

您可以創建所需順序的向量。 從字符串中刪除[] ,用逗號分割數據,使用ordermatch獲得正確的順序,將字符串paste回去。

如果共享的向量被稱為x你可以做 -

correct_order <- c('Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                   'Friday', 'Saturday', 'Sunday')

sapply(strsplit(gsub('\\[|\\]', '', x), ','), function(y) {
  paste(y[order(match(y,correct_order))], collapse = ',')
})

# [1] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [2] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [3] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [4] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [5] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [6] "Monday,Tuesday,Thursday,Saturday,Sunday" 
# [7] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [8] "Monday,Tuesday,Wednesday,Thursday,Friday"
# [9] "Monday,Tuesday,Wednesday,Thursday,Friday"
#[10] "Monday,Tuesday,Wednesday,Thursday,Friday"
#[11] "Monday,Tuesday,Wednesday,Thursday,Friday"
#[12] "Monday,Tuesday,Wednesday,Thursday,Friday"
#[13] "Monday,Tuesday,Wednesday,Thursday,Friday"
#[14] "Monday,Tuesday,Wednesday,Thursday,Friday"
#[15] "Monday,Tuesday,Thursday,Friday,Saturday" 

如果您需要[]返回 -

result <- sapply(strsplit(gsub('\\[|\\]', '', x), ','), function(y) {
  paste(y[order(match(y,correct_order))], collapse = ',')
})

result <- sprintf('[%s]', result)
result

# [1] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [2] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [3] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [4] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [5] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [6] "[Monday,Tuesday,Thursday,Saturday,Sunday]" 
# [7] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [8] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
# [9] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
#[10] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
#[11] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
#[12] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
#[13] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
#[14] "[Monday,Tuesday,Wednesday,Thursday,Friday]"
#[15] "[Monday,Tuesday,Thursday,Friday,Saturday]" 

這是另一種方法:

library(tidyverse)

as_tibble(x) %>% 
  mutate(row = row_number()) %>% 
  separate_rows("value") %>% 
  filter(value != "") %>% 
  mutate(value = fct_relevel(value, c('Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                                           'Friday', 'Saturday', 'Sunday')
                           )) %>% 
  group_by(row) %>% 
  arrange(value, .by_group = TRUE) %>% 
  summarise(new_col = toString(value)) %>% 
  select(-row)
    new_col                                     
   <chr>                                       
 1 Monday, Tuesday, Wednesday, Thursday, Friday
 2 Monday, Tuesday, Wednesday, Thursday, Friday
 3 Monday, Tuesday, Wednesday, Thursday, Friday
 4 Monday, Tuesday, Wednesday, Thursday, Friday
 5 Monday, Tuesday, Wednesday, Thursday, Friday
 6 Monday, Tuesday, Thursday, Saturday, Sunday 
 7 Monday, Tuesday, Wednesday, Thursday, Friday
 8 Monday, Tuesday, Wednesday, Thursday, Friday
 9 Monday, Tuesday, Wednesday, Thursday, Friday
10 Monday, Tuesday, Wednesday, Thursday, Friday
11 Monday, Tuesday, Wednesday, Thursday, Friday
12 Monday, Tuesday, Wednesday, Thursday, Friday
13 Monday, Tuesday, Wednesday, Thursday, Friday
14 Monday, Tuesday, Wednesday, Thursday, Friday
15 Monday, Tuesday, Thursday, Friday, Saturday 

數據:

c("[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Sunday,Thursday,Tuesday,Saturday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Monday,Tuesday,Wednesday,Thursday,Friday]", "[Monday,Tuesday,Wednesday,Thursday,Friday]", 
"[Saturday,Monday,Thursday,Tuesday,Friday]")

另一種方法:

library(tidyverse)

days <-
  c(
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Sunday,Thursday,Tuesday,Saturday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Monday,Tuesday,Wednesday,Thursday,Friday]",
    "[Saturday,Monday,Thursday,Tuesday,Friday]"
  )


dat <- tibble(days)

days_order <- c('Monday', 'Tuesday', 'Wednesday', 'Thursday', 
                'Friday', 'Saturday', 'Sunday')

dat %>%
    mutate(
        days = str_remove_all(days, "\\[|\\]") %>%
            str_split(",") %>%
            map(.f = ~ paste0(sort(ordered(.x, days_order)), collapse = ",")) %>%
            flatten_chr()
    )

#> # A tibble: 15 × 1
#>    days                                    
#>    <chr>                                   
#>  1 Monday,Tuesday,Wednesday,Thursday,Friday
#>  2 Monday,Tuesday,Wednesday,Thursday,Friday
#>  3 Monday,Tuesday,Wednesday,Thursday,Friday
#>  4 Monday,Tuesday,Wednesday,Thursday,Friday
#>  5 Monday,Tuesday,Wednesday,Thursday,Friday
#>  6 Monday,Tuesday,Thursday,Saturday,Sunday 
#>  7 Monday,Tuesday,Wednesday,Thursday,Friday
#>  8 Monday,Tuesday,Wednesday,Thursday,Friday
#>  9 Monday,Tuesday,Wednesday,Thursday,Friday
#> 10 Monday,Tuesday,Wednesday,Thursday,Friday
#> 11 Monday,Tuesday,Wednesday,Thursday,Friday
#> 12 Monday,Tuesday,Wednesday,Thursday,Friday
#> 13 Monday,Tuesday,Wednesday,Thursday,Friday
#> 14 Monday,Tuesday,Wednesday,Thursday,Friday
#> 15 Monday,Tuesday,Thursday,Friday,Saturday

reprex 包於 2022-07-09 創建 (v2.0.1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM