如何在 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>)")
另请注意,当您尝试将单词与一组数字(即 Auguest1990
到 August
和 1990
)分开时,您需要确保整个模式得到读。
示例:
dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?=[[:digit:]])", extra="merge")
我有一个数据集:
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>)")
另请注意,当您尝试将单词与一组数字(即 Auguest1990
到 August
和 1990
)分开时,您需要确保整个模式得到读。
示例:
dataframe %>% separate(column_to_sep, into = c("newCol1", "newCol2"), sep="(?=[[:digit:]])", extra="merge")