在不丢失字符的情况下拆分字符串-R
我在一个大得多的数据框中有两列,很难拆分。过去,当我试图使用“空格”、“空格”、“空格”或其他分隔符进行拆分时,我使用了在不丢失字符的情况下拆分字符串-R,r,strsplit,R,Strsplit,我在一个大得多的数据框中有两列,很难拆分。过去,当我试图使用“空格”、“空格”、“空格”或其他分隔符进行拆分时,我使用了strsplit。这里最困难的部分是我不想丢失任何信息,当我分割一些部分时,我将以丢失信息而告终。我希望最后有四个专栏。这是我现在拥有的几行的样本 age-gen surv-camp 45M 1LC 9F 0 12M 1AC 67M 1LC 这是我最终想要得到的 age gen surv camp 45 M
strsplit
。这里最困难的部分是我不想丢失任何信息,当我分割一些部分时,我将以丢失信息而告终。我希望最后有四个专栏。这是我现在拥有的几行的样本
age-gen surv-camp
45M 1LC
9F 0
12M 1AC
67M 1LC
这是我最终想要得到的
age gen surv camp
45 M 1 LC
9 F 0
12 M 1 AC
67 M 1 LC
我在这里做了很多的搜索,在爪哇、C++、HTML等方面都找到了一些响应,但是我没有找到任何解释如何在R中做这些,当你丢失数据的时候。
我看到了在值之间添加一个空格,然后在空格上进行拆分,但我不知道这将如何工作1)在缺少数据的情况下,2)当每行中没有一致的数字或字符值时。我们循环遍历'df1'的列(
lappy(df1,…
),使用sub
在数字子字符串后创建一个分隔符,使用read.table
将向量
作为data.frame读取,rbind
读取data.frames的列表
,并更改输出的列名
res <- do.call(cbind, lapply(df1, function(x)
read.table(text=sub("(\\d+)", "\\1,", x),
header=FALSE, sep=",", stringsAsFactors=FALSE)))
colnames(res) <- scan(text=names(df1), sep=".", what="", quiet = TRUE)
res
# age gen surv camp
#1 45 M 1 LC
#2 9 F 0
#3 12 M 1 AC
#4 67 M 1 LC
或者正如@Frank提到的,我们可以使用tstrsplit
fromdata.table
library(data.table)
setDT(df1)[, unlist(lapply(.SD, function(x)
tstrsplit(x, "(?<=[0-9])(?=[a-zA-Z])", perl=TRUE,
type.convert=TRUE)), recursive = FALSE)]
您仍然可以使用strsplit()
并使用perl
保存分割值。您的代码是什么?使用分离
效果很好。谢谢。我还没有能够调整第一个建议并使其成功运行,但我将使用您在开始时编写的逻辑,看看我是否幸运。@SamMarshal也许您的原始数据集已经成功运行了某些模式与您显示的模式不匹配。可能也值得显示data.table way,它具有良好的类型。convert
功能(不确定separate
是否有):data.table::tstrsplit(x)(?@akrun这也是我的想法,所以我会仔细检查每一步的逻辑,看看是否能找到问题的症结所在。@Frank Yesseparate
也有这个选项,但默认情况下它是FALSE
library(data.table)
setDT(df1)[, unlist(lapply(.SD, function(x)
tstrsplit(x, "(?<=[0-9])(?=[a-zA-Z])", perl=TRUE,
type.convert=TRUE)), recursive = FALSE)]
df1 <- structure(list(age.gen = c("45M", "9F", "12M", "67M"), surv.camp = c("1LC",
"0", "1AC", "1LC")), .Names = c("age.gen", "surv.camp"),
class = "data.frame", row.names = c(NA, -4L))