在字符串列中,删除第一个逗号(分隔符)之前的文本
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 = ", ")
}))
这必须是一个简单的 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 = ", ")
}))