【发布时间】:2021-01-12 11:39:31
【问题描述】:
输入数据集如下:
test = data.frame(Var_a = c("A|B","C|D|E","F"),Var_b = c("X"))
所需的输出数据集如下:
test1 = data.frame(Var_C = c("AX|BX","CX|DX|EX","FX"))
【问题讨论】:
输入数据集如下:
test = data.frame(Var_a = c("A|B","C|D|E","F"),Var_b = c("X"))
所需的输出数据集如下:
test1 = data.frame(Var_C = c("AX|BX","CX|DX|EX","FX"))
【问题讨论】:
这是一个基本的 R 选项:
在| 上拆分字符串,将每个单词粘贴到对应的Var_b 值,然后将字符串折叠回去。
test$Var_c <- mapply(function(x, y) paste0(x, y, collapse = '|'),
strsplit(test$Var_a, '|', fixed = TRUE), test$Var_b)
test
# Var_a Var_b Var_c
#1 A|B X AX|BX
#2 C|D|E X CX|DX|EX
#3 F X FX
【讨论】:
在添加最后一次粘贴的 id 后,您可以使用 {tidyverse} 中方便的 separate_rows() 将项目分隔为每行一个。
类似
library(tidyverse)
test <- data.frame(Var_a = c("A|B","C|D|E","F"),Var_b = c("X"))
test %>%
mutate(id = seq_len(nrow(test))) %>%
separate_rows(Var_a) %>%
mutate(Var_c = paste0(Var_a, Var_b)) %>%
group_by(id) %>%
summarise(Var_c = paste0(Var_c, collapse = "|"))
#> `summarise()` ungrouping output (override with `.groups` argument)
#> # A tibble: 3 x 2
#> id Var_c
#> <int> <chr>
#> 1 1 AX|BX
#> 2 2 CX|DX|EX
#> 3 3 FX
由reprex package (v0.3.0) 于 2021-01-12 创建
【讨论】:
使用 gsub 和前瞻正则表达式:
test%>%mutate(Var_C=gsub('(\\w)(?=\\||$)',paste0('\\1',Var_b),Var_a, perl=TRUE))
# Var_a Var_b Var_C
#1 A|B X AX|BX
#2 C|D|E X CX|DX|EX
#3 F X FX
【讨论】: