如果您能给我建议,我将不胜感激.我想拆分逗号后的字符串,但需要保留包含逗号的括号内的文本(即不拆分).在我的数据中,有4种关于空格和逗号的可能性.

1括号(c,d)内逗号后没有空格 2圆括号中逗号后的空格(x,y) 3括号url.d,url.e外的逗号后有一个空格 4括号url.d、url.e外的逗号后没有空格

在下面的示例中,url.b(c,d)和url.h(x,y)需要一起出现.在下面的代码中,第8行和第9行需要一起出现.11号线需要拆分.

my_df = data.frame(id=1:4, urls=c("url.a, url.b (c,d), url.c",
                                  "url.d, url.e, url.f",
                                  "url.g, url.h (x, y), url.i",
                                  "url.d,url.e, url.f"))


tidytext::unnest_tokens(my_df, out, urls, token = 'regex', pattern=",\\s+")

   id         out
1   1       url.a
2   1 url.b (c,d)
3   1       url.c
4   2       url.d
5   2       url.e
6   2       url.f
7   3       url.g
8   3    url.h (x
9   3          y)
10  3       url.i
11  4 url.d,url.e
12  4       url.f

谢谢!

推荐答案

(测试数据更新后第二次try )

这里有一个可以try 的策略:

  • 在圆括号中使用占位符作为逗号(让我们 Select |)
  • 使用",\\s*"进行拆分,它将匹配所有带有可选尾随空格的逗号
  • 恢复逗号
library(dplyr)
library(stringr)
library(tidytext)

my_df = data.frame(id=1:4, urls=c("url.a, url.b (c,d), url.c",
                                  "url.d, url.e, url.f",
                                  "url.g, url.h (x, y), url.i",
                                  "url.d,url.e, url.f"))

# before applying unnest_tokens, replace commas in parenthesis 
# with a placeholder, `|`
my_df %>% 
  mutate(urls = str_replace_all(urls, 
                                "\\(([^)]*)\\)", 
                                \(match) str_replace_all(match, fixed(","), "|"))) %>% 
  unnest_tokens(out, urls, token = 'regex', pattern=",\\s*") %>% 
  # 恢复逗号
  mutate(out = str_replace_all(out, fixed("|"), ","))
#>    id          out
#> 1   1        url.a
#> 2   1  url.b (c,d)
#> 3   1        url.c
#> 4   2        url.d
#> 5   2        url.e
#> 6   2        url.f
#> 7   3        url.g
#> 8   3 url.h (x, y)
#> 9   3        url.i
#> 10  4        url.d
#> 11  4        url.e
#> 12  4        url.f


仔细看看str_replace_all(..., \(x) do_something(x))个, "\\(([^)]*)\\)"用于查找括在括号中的子字符串:

str_view("url.a, url.b (c,d, foo, bar), url.c", "\\(([^)]*)\\)")
#> [1] │ url.a, url.b <(c,d, foo, bar)>, url.c

但是我们将不使用替换字符串,而是使用替换函数来修改我们的匹配,并用占位符|替换, (假设urls列中的任何位置都没有使用|):

# \(match) ... notation is a shorthand for anonymous / lambda function
anon_function <- \(match) str_replace_all(match, fixed(","), "|")
anon_function("c,d, foo")
#> [1] "c|d| foo"

将这两个部分相加以消除()之间的所有逗号:

str_replace_all(my_df$urls, "\\(([^)]*)\\)", \(match) str_replace_all(match, fixed(","), "|"))
#> [1] "url.a, url.b (c|d), url.c"  "url.d, url.e, url.f"       
#> [3] "url.g, url.h (x| y), url.i" "url.d,url.e, url.f"

创建于2023-11-22与reprex v2.0.2

R相关问答推荐

通过R访问MoveApps API

如何判断某列中由某些行组成的百分比

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

如何在R中正确对齐放射状图中的文本

gt()从gt为相同内容的单元格 colored颜色 不同?

如何在R中对深度嵌套的tibbles中的非空连续行求和?

删除具有相同标题的tabPanel(shinly)

使用整齐的计算(curl -curl )和杂音

如果可能,将数字列转换为整数,否则保留为数字

LOF中的插图短文字幕

您是否可以折叠R中的重复行,同时保留基于所选列的值?

从数据创建数字的命名列表.R中的框

手动指定从相同数据创建的叠加图的 colored颜色

将列表中的字符串粘贴到R中for循环内的dplyr筛选器中

创建在文本字符串中发现两个不同关键字的实例的数据框

整理曲线图、曲线图和点图

变异以按组从其他列创建具有最大和最小值的新列

ArrangeGrob()和类似的替代方法不接受Grob列表.在Grid.Draw,返回:glist中的错误(...):仅允许在glist";中使用Grobs;

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?