在字符串列中,删除第一个逗号(分隔符)之前的文本

In string column, remove text preceding first comma (delimiter)

这必须是一个简单的 sub 或 gsub,但我似乎无法在 soverflow 上找到它。可能在某处重复,但在某处我似乎找不到。

数据

df <- data.frame(c1=c(1:4),c2=c("431, Dallas, TX", "c63728 , Denver, CO", ",New Orleans, LA", "somewhere,NY, NY"))

需要数据

df.desired <- data.frame(c1=c(1:4),c2=c("Dallas, TX", "Denver, CO", "New Orleans, LA", "NY, NY"))

下面由 pasqui 针对我所问的内容进行了编辑,但我正在稍微修改问题

我只想删除第一个字符串和逗号。所以我希望它也能在下面工作:

数据

df <- data.frame(c1=c(1:4),c2=c("431, Dallas, TX, 75225", "c63728 , Denver, CO, 80121", ",New Orleans, LA", "somewhere,NY, NY"))

需要数据

df.desired <- data.frame(c1=c(1:4),c2=c("Dallas, TX, 75225", "Denver, CO, 80121", "New Orleans, LA", "NY, NY"))
library(dplyr)

df %>% 
    mutate(c2 = gsub("(^.*,\s{0,1})(.*,.*$)", "\2", c2))

#Output
  c1              c2
1  1      Dallas, TX
2  2      Denver, CO
3  3 New Orleans, LA
4  4          NY, NY

注意:这是一个基于“捕获组”的解决方案:它们在认知经济(对人类)方面是好的。机器有更高效的选项。

编辑中:

调整正则表达式以应对这两种情况

我一直在玩正则表达式捕获组

鉴于第二个 data.frame:

df <- data.frame(c1=c(1:4),c2=c("431, Dallas, TX, 75225", "c63728 , Denver, CO, 80121", ",New Orleans, LA", "somewhere,NY, NY"))

我们申请:

df %>% 
    mutate(c2 = gsub("(^.*,{1}?)(.*,.*$)", "\2", c2))

输出为:

  c1                 c2
1  1  Dallas, TX, 75225
2  2  Denver, CO, 80121
3  3    New Orleans, LA
4  4             NY, NY

它也适用于您的第一个示例

对于基础 R,您可以使用:

df$desired  <- trimws(gsub(pattern='^.*?,', replacement = '', df$c2), which='left')

或者使用 tidyverse:

library(dplyr)
library(stringr)

df %>% 
  mutate(desired = 
           str_replace(c2, pattern = '^.*?,', replacement = ""),
         desired = str_trim(desired, side='left')) -> df

'^.*?,' 表达式查找字符串开头到第一个逗号的所有值。这 ?根据这个关于堆栈溢出的答案搜索逗号时使表达式不贪婪:

Regular expression to stop at first match

您可以使用 str_split,删除每个向量的第一个条目,然后将它们全部粘贴回一起

df %>% 
  mutate(c2 = c2 %>% str_split(",") %>%
           lapply(function(x){
             x[-1] %>% 
               str_trim() %>% 
               str_c(collapse = ", ")
           }))