在数据框的分隔符处分隔列

我想根据分隔符在数据框内将一列分成两列。 例如,

a|b b|c 

成为

 ab bc 

在一个数据框内。

谢谢!

@Taesung Shin是对的,但是只是把它变成一个data.frame 。 我添加了一个“x | y”行以避免含糊不清:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) foo <- data.frame(do.call('rbind', strsplit(as.character(df$FOO),'|',fixed=TRUE))) 

或者,如果您要replace现有data.frame中的列:

 within(df, FOO<-data.frame(do.call('rbind', strsplit(as.character(FOO), '|', fixed=TRUE)))) 

其中产生:

  ID FOO.X1 FOO.X2 1 11 ab 2 12 bc 3 13 xy 

哈德利有一个非常优雅的解决scheme,在他的colsplit包中使用函数colsplit在数据框中执行此colsplit

 require(reshape) > df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) > df ID FOO 1 11 a|b 2 12 b|c 3 13 x|y > df = transform(df, FOO = colsplit(FOO, split = "\\|", names = c('a', 'b'))) > df ID FOO.a FOO.b 1 11 ab 2 12 bc 3 13 xy 

新stream行的tidyr包与separate做这个。 它使用正则expression式,所以你必须逃避|

 df <- data.frame(ID=11:13, FOO=c('a|b', 'b|c', 'x|y')) separate(data = df, col = FOO, into = c("left", "right"), sep = "\\|") ID left right 1 11 ab 2 12 bc 3 13 xy 

尽pipe在这种情况下默认是足够聪明的工作(它寻找非字母数字字符拆分)。

 separate(data = df, col = FOO, into = c("left", "right")) 

刚刚遇到这个问题,因为它是在最近的一个关于SO的问题上联系起来的。

无耻的答案插件:使用我的“splitstackshape”包中的concat.split.multiple:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) library(splitstackshape) concat.split.multiple(df, "FOO", "|") # ID FOO_1 FOO_2 # 1 11 ab # 2 12 bc # 3 13 xy 

即使每列都有不同的分隔符,这个特殊的函数也可以处理分割多个列:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'), BAR = c("A*B", "B*C", "C*D")) concat.split.multiple(df, c("FOO", "BAR"), c("|", "*")) # ID FOO_1 FOO_2 BAR_1 BAR_2 # 1 11 ab AB # 2 12 bc BC # 3 13 xy CD 

从本质上讲,它是一个使用read.table(text = some_character_vector, sep = some_sep)并将输出绑定到原始数​​据data.frame的花式便利包装器。 换句话说,另一个基本的R方法可能是:

 df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y')) cbind(df, read.table(text = as.character(df$FOO), sep = "|")) ID FOO V1 V2 1 11 a|bab 2 12 b|cbc 3 13 x|yxy 
 strsplit(c('a|b','b|c'),'|',fixed=TRUE) 

结合@Ramnath和@ Tommy的答案,使我能够find一种方法,在一个或多个列的基R中工作。

基本用法:

 > df = data.frame( + id=1:3, foo=c('a|b','b|c','c|d'), + bar=c('p|q', 'r|s', 's|t'), stringsAsFactors=F) > transform(df, test=do.call(rbind, strsplit(foo, '|', fixed=TRUE)), stringsAsFactors=F) id foo bar test.1 test.2 1 1 a|bp|qab 2 2 b|cr|sbc 3 3 c|ds|tcd 

多栏:

 > transform(df, lapply(list(foo,bar), + function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F) id foo bar X1 X2 X1.1 X2.1 1 1 a|bp|qabpq 2 2 b|cr|sbcrs 3 3 c|ds|tcdst 

更好地命名多个拆分列:

 > transform(df, lapply({l<-list(foo,bar);names(l)=c('foo','bar');l}, + function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F) id foo bar foo.1 foo.2 bar.1 bar.2 1 1 a|bp|qabpq 2 2 b|cr|sbcrs 3 3 c|ds|tcdst