实际上,这个问题并不是我最初提出的。这个问题促使我将其简化成一个简单的情况。
因此,我需要根据当前情况中的分隔符(;
)将输入到单元格(列中)的数据分离为单独的行。可以使用tidyr::separate_rows()
轻松完成此操作。几乎每一列中的数据已经被连接在一起。现在有两个问题:
- 可能会有用
()
括起来但用;
分隔的文本,例如(text_A;text_B)
,这些文本要保持连接而不是分开。 - 在每行的不同列之间,连接次数可能不均匀。在这种情况下,该行应被分成等于最大连接次数的
每个单独的行
。对于其他连接较少的列,最后的文本值可能只是重复的。
以下是一个可重现的示例:
input <- data.frame(
stringsAsFactors = FALSE,
col_1 = c("A", "B", "C"),
Col_2 = c("Text_A;Text_B","Text_C","Text_D;(Text_E;Text_F)"),
Col_3 = c("Text_1", "Text_2;Text_3", "Text_4"),
Col_4 = c("Text_a;(Text_b;Text_c);(Text_d;Text_dd)","Text_e","Text_f;Text_g")
)
input
col_1 Col_2 Col_3 Col_4
1 A Text_A;Text_B Text_1 Text_a;(Text_b;Text_c);(Text_d;Text_dd)
2 B Text_C Text_2;Text_3 Text_e
3 C Text_D;(Text_E;Text_F) Text_4 Text_f;Text_g
期望的输出如下所示:
output
#> col_1 Col_2 Col_3 Col_4
#> 1 A Text_A Text_1 Text_a
#> 2 A Text_B Text_1 (Text_b;Text_c)
#> 3 A Text_B Text_1 (Text_d;Text_dd)
#> 4 B Text_C Text_2 Text_e
#> 5 B Text_C Text_3 Text_e
#> 6 C Text_D Text_4 Text_f
#> 7 C (Text_E;Text_F) Text_4 Text_g
除了 tidyverse
以外的答案也是可以接受的。