如何合并具有可變數量分隔符的列,以便獲得類似輸出的內容(假設所有內容都是字符)?
dt1
letter
1 a
2 b c
3 c
4 d e f g
5 a g e
dt2
letter number
1 a 1
2 b 2
3 c 3
4 d 4
5 e 5
6 f 6
7 g 7
> output
letter number
1 a 1
2 b c 2 3
3 c 3
4 d e f g 4 5 6 7
5 a g e 1 7 5
dt1<-data.frame(letter=c("a","b c","c","d e f g","a g e"))
dt2<-data.frame(letter=c("a","b","c","d","e","f","g"),number=c("1","2","3","4","5","6","7"))
output<-data.frame(letter=c("a","b c","c","d e f g","a g e"), number=c("1","2 3","3","4 5 6 7","1 7 5"))
uj5u.com熱心網友回復:
一個基本的 R 解決方案可以是,
dt1$res <- sapply(strsplit(dt1$letter, ' ', fixed = TRUE), function(i)paste(dt2$number[dt2$letter %in% i], collapse = ' '))
# letter res
#1 a 1
#2 b c 2 3
#3 c 3
#4 d e f g 4 5 6 7
#5 a g e 1 5 7
uj5u.com熱心網友回復:
無需拆分任何資料,因為您只想替換特定數字的特定字母。
dt1<-data.frame(letter=c("a","b c","c","d e f g","a g e"), stringsAsFactors = F)
dt2<-data.frame(letter=c("a","b","c","d","e","f","g"),number=c("1","2","3","4","5","6","7"), stringsAsFactors = F)
library(stringi)
dt1 %>% mutate(number = stri_replace_all_regex(letter, dt2$letter, dt2$number, vectorize_all = F))
letter number
1 a 1
2 b c 2 3
3 c 3
4 d e f g 4 5 6 7
5 a g e 1 7 5
另一個解決方案可能更短
dt1 <- data.frame(letter=c("a","b c","c","d e f g","a g e"), stringsAsFactors = F)
v <- c("1","2","3","4","5","6","7")
names(v) <- c("a","b","c","d","e","f","g")
dt1 %>% mutate(number = str_replace_all(letter, v))
uj5u.com熱心網友回復:
library(tidyverse)
dt1 <- data.frame(letter = c("a", "b c", "c", "d e f g", "a g e"))
dt2 <- data.frame(letter = c("a", "b", "c", "d", "e", "f", "g"),
number = c("1", "2", "3", "4", "5", "6", "7"))
dt1 %>%
as_tibble() %>%
mutate(
number = letter %>% map_chr(~ .x %>%
str_split("[ ]") %>%
simplify() %>%
map_chr(~ deframe(dt2)[.x]) %>%
paste0(collapse = " ")
)
)
#> # A tibble: 5 x 2
#> letter number
#> <chr> <chr>
#> 1 a 1
#> 2 b c 2 3
#> 3 c 3
#> 4 d e f g 4 5 6 7
#> 5 a g e 1 7 5
由reprex 包(v2.0.1)于 2021 年 12 月 14 日創建
uj5u.com熱心網友回復:
使用tidyverse.
library(tidyverse)
output <- dt1 %>%
mutate(ID = 1:n()) %>%
separate_rows(letter, sep = "\\ ") %>%
left_join(dt2, by = "letter") %>%
group_by(ID) %>%
summarize(across(.fns = ~paste0(., collapse = " "))) %>%
ungroup() %>%
select(-ID)
output
# # A tibble: 5 x 2
# letter number
# <chr> <chr>
# 1 a 1
# 2 b c 2 3
# 3 c 3
# 4 d e f g 4 5 6 7
# 5 a g e 1 7 5
uj5u.com熱心網友回復:
dt1<-data.frame(letter=c("a","b c","c","d e f g","a g e"))
dt2<-data.frame(letter=c("a","b","c","d","e","f","g"),number=c("1","2","3","4","5","6","7"))
library(tidyverse)
dt1 %>%
rowwise() %>%
mutate(tmp = str_split(letter, pattern = "\\ ")) %>%
ungroup() %>%
mutate(number = map_chr(tmp, ~paste0(match(.x, dt2$letter), collapse = " "))) %>%
select(-tmp)
#> # A tibble: 5 x 2
#> letter number
#> <chr> <chr>
#> 1 a 1
#> 2 b c 2 3
#> 3 c 3
#> 4 d e f g 4 5 6 7
#> 5 a g e 1 7 5
由reprex 包(v2.0.1)于 2021 年 12 月 14 日創建
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380643.html
上一篇:R中方括號的作用
下一篇:如何使用sf更改共享邊框的顏色?
