如何在 R 中用 tidyr::separate 拆分字符串并保留分隔符字符串的值?

How do I split a string with tidyr::separate in R and retain the values of the separator string?

我有一个数据集:

crimes<-data.frame(x=c("Smith", "Jones"), charges=c("murder, first degree-G, manslaughter-NG", "assault-NG, larceny, second degree-G"))

我正在使用 tidyr:separate 在与 "G,"

的比赛中拆分费用列
crimes<-separate(crimes, charges, into=c("v1","v2"), sep="G,")

这拆分了我的列,但删除了分隔符 "G,"。我想在结果列拆分中保留 "G,"。

我想要的输出是:

 x         v1                       v2
 Smith     murder, first degree-G   manslaughter-NG
 Jones     assault-NG               larceny, second degree-G

欢迎提出任何建议。

更新

这就是你要的。请记住,您的数据不整齐(V1 和 V2 的每一列中都有一个以上的变量)

A<-separate(crimes,charges,into=c("V1","V2"),sep = "(?<=G,)")
A
      x                      V1                        V2
1 Smith murder, first degree-G,           manslaughter-NG
2 Jones             assault-NG,  larceny, second degree-G

保持 "G" 或 "NG" 的更简单方法是使用 sep=", ",正如 alistaire 所说。

A<-separate(crimes, charges, into=c("v1","v2"), sep = ', ')

这给出了

      x         v1              v2
1 Smith   murder-G manslaughter-NG
2 Jones assault-NG       larceny-G

如果您想继续分隔 data.frame(使用 -)

separate(A, v1, into = c("v3","v4"), sep = "-")

这给了

      x      v3 v4              v2
1 Smith  murder  G manslaughter-NG
2 Jones assault NG       larceny-G

您需要为 v2 列再次执行此操作。我不知道你是否想继续分开,请post你的预期输出以使我的回答更具体。

用您的正则表达式替换 <yourRegexPattern>

如果你想要左栏的'sep'(往后看)

dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?<=<yourRegexPattern>)")

如果你想要右栏的'sep'(往前看)

dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?=<yourRegexPattern>)")

另请注意,当您尝试将单词与一组数字(即 Auguest1990August1990)分开时,您需要确保整个模式得到读。

示例:

dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?=[[:digit:]])", extra="merge")