拆分列分隔符R

问题描述:

我有一个数据框如下。我想将最后一列拆分为2.拆分需要根据唯一的第一列完成:其余列不重要。拆分列分隔符R

在新的数据框中,会有4列。第3列将是(a,b,d),而第4列将是(1,2:3,3:4:4)

有什么建议吗?我的代码的第四行不起作用:(。我没关系用全新的解决方案或更正行4

employee <- c('John Doe','Peter Gynn','Jolie Hope') 
salary <- c(3, 2, 1) 
df <- data.frame(employee, salary, originalColumn = c("a :1", "b :2:3", "d: 3:4:4")) 

as.data.frame(do.call(rbind, strsplit(df,":"))) 

-------------------- update1

下面的解决方案工作的很好,但是我需要一个修改后的解决方案,因为我刚刚意识到第3列中的某些单元格不会有“:”,在这种情况下,我希望该单元格中的文本仅出现在第1列拆分该列

employee <- c('John Doe','Peter Gynn','Jolie Hope') 
salary <- c(3, 2, 1) 
df <- data.frame(employee, salary, originalColumn = c("a :1", "b", "d: 3:4:4")) 
+1

可能重复[使用strsplit与数据帧将标签列分成多个](http://*.com/questions/4350440/using-strsplit-with -data-frames-split-label-columns-into-multiple) – Stedy 2014-10-29 18:25:37

+0

我不这么认为。我试过命令:str_split_fixed(df $ originalcolumn,“:”,2)但它没有工作:( – user2543622 2014-10-29 18:29:10

+1

这几乎是一个骗局,你只是缺少'as.character(df $ originalcolumn)'。但无论如何'stringr :: str_split'避免了这一点,并增加了方便的'n = 2'参数。请参阅我的解决方案。 – smci 2014-10-29 18:42:17

你可以使用cSplit。在更新后的数据帧,

library(splitstackshape) 
cSplit(df, "originalColumn", sep = ":{1}") 
#  employee salary originalColumn_1 originalColumn_2 
# 1: John Doe  3    a    1 
# 2: Peter Gynn  2    b    NA 
# 3: Jolie Hope  1    d   3:4:4 

而原始数据帧,

df1 <- data.frame(employee, salary, 
        originalColumn = c("a :1", "b :2:3", "d: 3:4:4")) 
cSplit(df1, "originalColumn", sep = ":{1}") 
#  employee salary originalColumn_1 originalColumn_2 
# 1: John Doe  3    a    1 
# 2: Peter Gynn  2    b    2:3 
# 3: Jolie Hope  1    d   3:4:4 

注:我使用splitstackshape 1.4.2版本。我相信sep参数已从版本1.4.0更改为

+0

+1好方法。但是,由于某种原因,这不适合我。我使用'splitstackshape_1.4.0' – akrun 2014-10-29 19:21:28

+0

我在1.4.2上。我认为'sep' arg已被更改 – 2014-10-29 19:22:39

+0

谢谢,我会更新。 – akrun 2014-10-29 19:24:45

你可以使用extracttidyr分裂originalColumn中的two列。在下面的代码中,我创建了3列,并从结果中删除了一个不需要的列。

library(tidyr) 
pat <- "([^ :])(?:|: ?|)(.*)" 
extract(df, originalColumn, c("Col1", "ColN", "Col2"), pat)[,-4] 
#  employee salary Col1 Col2 
#1 John Doe  3 a  1 
#2 Peter Gynn  2 b 2:3 
#3 Jolie Hope  1 d 3:4:4 

使用更新df,(为了更好的识别 - df1

extract(df1, originalColumn, c("Col1", "ColN", "Col2"), pat)[,-4] 
# employee salary Col1 Col2 
#1 John Doe  3 a  1 
#2 Peter Gynn  2 b  
#3 Jolie Hope  1 d 3:4:4 

或不df基于该模式在df

extract(df, originalColumn, c("Col1", "Col2"), "(.)[ :](.*)") %>% 
            mutate(Col2= gsub("^\\:", "", Col2)) 

# employee salary Col1 Col2 
#1 John Doe  3 a  1 
#2 Peter Gynn  2 b 2:3 
#3 Jolie Hope  1 d 3:4:4 

创建一个新的column,下面代码也起作用。这里,用于提取第一列的regex(.)。圆点内的字符串开始处的单个元素将被提取用于Col1。然后.{2}之后的两个元素被丢弃,括号内的其余部分(.*)形成Col2

extract(df, originalColumn, c("Col1", "Col2"), "(.).{2}(.*)") 
# employee salary Col1 Col2 
#1 John Doe  3 a  1 
#2 Peter Gynn  2 b 2:3 
#3 Jolie Hope  1 d 3:4:4 

或使用strsplit

as.data.frame(do.call(rbind, strsplit(as.character(df$originalColumn), " :|: "))) 
# V1 V2 
#1 a  1 
#2 b 2:3 
#3 d 3:4:4 

对于df1,这里使用的解决方案strsplit

lst <- strsplit(as.character(df1$originalColumn), " :|: ") 
    as.data.frame(do.call(rbind,lapply(lst, 
      `length<-`, max(sapply(lst, length))))) 
    # V1 V2 
#1 a  1 
#2 b <NA> 
#3 d 3:4:4 
+0

我们是否需要这两个包? – user2543622 2014-10-29 18:36:26

+0

@ user2543622如果第二个选项有效,你只需要'tidyr' – akrun 2014-10-29 18:36:56

+0

请解释第四个参数的功能我看了一下R中的函数定义/帮助,但是没有第四个参数我在说关于命令:extract(df,originalColumn ,c(“Col1”,“Col2”),“(。)。{2}(。*)”) – user2543622 2014-10-29 18:44:03

你接近,这里有一个解决方案:

library(stringr) 

df[, c('Col1','Col2')] <- do.call(rbind, str_split_fixed(df$originalColumn,":",n=2)) 
df$originalColumn <- NULL 

    employee salary Col1 Col2 
1 John Doe  3 a  1 
2 Peter Gynn  2 b  2:3 
3 Jolie Hope  1 d 3:4:4 

注:

  • stringr::str_split()base::strsplit()更好,因为你没有做as.character(),也有要限制对第一只拆分n=2说法“:”
+0

请检查u pdated question – user2543622 2014-10-29 18:54:30

+0

然后使用'str_split_fixed()'。工作正常。 – smci 2014-10-29 19:29:47