我是编码新手,我正在尝试用R:解决这个问题
我得到了一张表的两列,它们都是长度不等的字符串。链的元素由一个符号分隔。现在,我想为每一行提取两个字符串链的差异,并将其写入一个新列。
Stringchain 1 | Stringchain 2 | 结果|
---|---|---|
A00;B01;C02;D03 | A00;B01;C02;D03;E04 | E04 |
E04;F05;G06;H07 | F05;G06;H07;I08 | E04;I08 |
这里有一些类似于您使用tidyverse的方法。我创建了两个伪列vec_1
和vec_2
,在其中我将字符串转换为矢量的列表列。诀窍是使用地图(或从底部开始(对每一行进行操作。
library(dplyr)
library(tokenizers)
library(purrr)
df %>%
mutate(vec_1 = map(Stringchain_1, tokenize_regex, pattern = ";", simplify = TRUE),
vec_2 = map(Stringchain_2, tokenize_regex, pattern = ";", simplify = TRUE),
Result = map2_chr(vec_1, vec_2,
~ paste(c(setdiff(.x, .y), setdiff(.y, .x)),
collapse = ";")))
这就是结果。现在可以删除任何不需要的列。
# A tibble: 2 x 5
Stringchain_1 Stringchain_2 vec_1 vec_2 Result
<chr> <chr> <list> <list> <chr>
1 A00;B01;C02;D03 A00;B01;C02;D03;E04 <chr [4]> <chr [5]> E04
2 E04;F05;G06;H07 F05;G06;H07;I08 <chr [4]> <chr [4]> E04;I08
我们可以在base R
中通过用strsplit
拆分两列来实现这一点,通过用Map
和paste
在相应的list
元素上循环来获得setdiff
df1$Result <- unlist(Map(function(x, y) paste(sort(union(setdiff(y, x),
setdiff(x, y))), collapse = ";"),
strsplit(df1$Stringchain1, ";"), strsplit(df1$Stringchain2, ";")))
-输出
> df1
Stringchain1 Stringchain2 Result
1 A00;B01;C02;D03 A00;B01;C02;D03;E04 E04
2 E04;F05;G06;H07 F05;G06;H07;I08 E04;I08
数据
df1 <- structure(list(Stringchain1 = c("A00;B01;C02;D03", "E04;F05;G06;H07"
), Stringchain2 = c("A00;B01;C02;D03;E04", "F05;G06;H07;I08")), row.names = c(NA,
-2L), class = "data.frame")