Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在不丢失字符的情况下拆分字符串-R_R_Strsplit - Fatal编程技术网

在不丢失字符的情况下拆分字符串-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
from
data.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 Yes
separate
也有这个选项,但默认情况下它是
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))