简体   繁体   English

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

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

I have a data frame with columns of these values.我有一个包含这些值列的数据框。 I want to split them into vectors and rearrange them according to Monday -> Sunday based on the values inside.我想将它们拆分为向量并根据内部值根据星期一->星期日重新排列它们。 Is there a way to do it?有没有办法做到这一点? I tried using str_split (column_name,",") but it doesn't split the string.我尝试使用 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]")

A base R solution -一个基本的 R 解决方案 -

You can create a vector of the order that you want.您可以创建所需顺序的向量。 Remove [] from the string, split the data on comma, use order and match to get correct order, paste the string back.从字符串中删除[] ,用逗号分割数据,使用ordermatch获得正确的顺序,将字符串paste回去。

If the vector shared is called x you can do -如果共享的向量被称为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" 

If you need [] back -如果您需要[]返回 -

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]" 

Here is an alternative approach:这是另一种方法:

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 

data:数据:

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]")

Another approach:另一种方法:

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

Created on 2022-07-09 by the reprex package (v2.0.1)reprex 包于 2022-07-09 创建 (v2.0.1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM