我们可以做
library(dplyr)
library(stringr)
library(purrr)
df1 <- df1 %>%
mutate(Fruit = map_chr(strsplit(Fruit, ",\\s*"),
~ toString(.x[order(match(.x,
c("apple", "orange", "papaya", "banana", "grape")))])))
-output
df1
Fruit X Y Z
1 apple, orange, papaya, banana a f k
2 orange, banana, grape b g l
3 orange, banana c h m
4 grape d i n
5 apple, orange, papaya, banana, grape e j o
或者使用separate_longer_delim
library(tidyr)
df1 <- df1 %>%
mutate(rn = row_number()) %>%
separate_longer_delim(Fruit, delim = regex(",\\s*")) %>%
arrange(rn, factor(Fruit,
levels = c("apple", "orange", "papaya", "banana", "grape"))) %>%
reframe(Fruit = str_c(Fruit, collapse = ", "),
.by = c("rn", "X", "Y", "Z")) %>%
select(-rn) %>%
relocate(Fruit, .before = 1)
-output
df1
Fruit X Y Z
1 apple, orange, papaya, banana a f k
2 orange, banana, grape b g l
3 orange, banana c h m
4 grape d i n
5 apple, orange, papaya, banana, grape e j o
如果该列是list
,我们不需要strsplit
, 反而
df1 <- df1 %>%
mutate(Fruit = map(Fruit,
~ .x[order(match(.x, c("apple", "orange", "papaya", "banana", "grape")))]))
Or with unnest
df1 <- df1 %>%
mutate(rn = row_number()) %>%
unnest(Fruit) %>%
arrange(rn, factor(Fruit,
levels = c("apple", "orange", "papaya", "banana", "grape"))) %>%
reframe(Fruit = list(Fruit),
.by = c("rn", "X", "Y", "Z")) %>%
select(-rn) %>%
relocate(Fruit, .before = 1)
-output
df1
# A tibble: 5 × 4
Fruit X Y Z
<list> <chr> <chr> <chr>
1 <chr [4]> a f k
2 <chr [3]> b g l
3 <chr [2]> c h m
4 <chr [1]> d i n
5 <chr [5]> e j o
data
df1 <- structure(list(Fruit = c("apple, banana, orange, papaya", "banana, orange, grape",
"orange, banana", "grape", "banana, grape, orange, apple, papaya"
), X = c("a", "b", "c", "d", "e"), Y = c("f", "g", "h", "i",
"j"), Z = c("k", "l", "m", "n", "o")), class = "data.frame", row.names = c(NA,
-5L))