拆分列分隔符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"))
你可以使用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更改为
你可以使用extract
从tidyr
分裂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
我们是否需要这两个包? – user2543622 2014-10-29 18:36:26
@ user2543622如果第二个选项有效,你只需要'tidyr' – akrun 2014-10-29 18:36:56
请解释第四个参数的功能我看了一下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
说法“:”
请检查u pdated question – user2543622 2014-10-29 18:54:30
然后使用'str_split_fixed()'。工作正常。 – smci 2014-10-29 19:29:47
可能重复[使用strsplit与数据帧将标签列分成多个](http://stackoverflow.com/questions/4350440/using-strsplit-with -data-frames-split-label-columns-into-multiple) – Stedy 2014-10-29 18:25:37
我不这么认为。我试过命令:str_split_fixed(df $ originalcolumn,“:”,2)但它没有工作:( – user2543622 2014-10-29 18:29:10
这几乎是一个骗局,你只是缺少'as.character(df $ originalcolumn)'。但无论如何'stringr :: str_split'避免了这一点,并增加了方便的'n = 2'参数。请参阅我的解决方案。 – smci 2014-10-29 18:42:17