在数据框的分隔符处分隔列
我想根据分隔符在数据框内将一列分成两列。 例如,
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