使用strsplit以三种方式分割变量

时间:2014-01-30 20:55:59

标签: r strsplit

我有一个我要分割的变量......每一行都不同但它有两个字符串表达式,用“,”分隔; 3个字符串表达式用','分隔; 1字符串表达式;或者什么都没有

例如:

     indel
row1 +1C
row2 +1C,+2CC
row3 0
row4 +1C,+2CC,-1C

基本上我想要做的是为每个可能的三个字符串表达式创建3个不同的变量。当然,有些行会有2个,或1个或没有。

我已经能够使用以下方法为前两个字符串表达式拆分并创建两个不同的变量:

mito$indel1 <- sapply(strsplit(as.character(mito$indel),","),function(x) x[1])
mito$indel2 <- sapply(strsplit(as.character(mito$indel),","),function(x) x[2])

但当然,还有第三个字符串表达式。我正在考虑创建一个临时的indel2变量,然后再将它拆分成第三个,但使用上面的R脚本的问题是它创建了变量:

     indel         Indel1    Indel2
row1 +1C           +1C       NA
row2 +1C,+2CC      +1C       +2CC
row3 0             0         NA
row4 +1C,+2T,-1C   +1C       +2T

我确定这与字符串中的第二个“,”有关,而R正在变得混乱。但有没有办法克服这一点,而无需编辑每一行的整个变量。

我也试过以下但没有运气:

mito$indel2 <- sapply(strsplit(sapply(strsplit(as.character(mito$indel),","),function(x) x[2]),","),function(x) x[1])
mito$indel3 <- sapply(strsplit(sapply(strsplit(as.character(mito$indel),","),function(x) x[2]),","),function(x) x[2])

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:9)

您也可以使用read.table

read.table(text=as.character(dat$V1), sep=',', fill=TRUE, as.is=TRUE)
#    V1   V2  V3
# 1 +1C         
# 2 +1C +2CC    
# 3   0         
# 4 +1C +2CC -1C

答案 1 :(得分:5)

也许是splitstackshape包:

library(splitstackshape)
dat <- read.table(text="+1C
+1C,+2CC
0
+1C,+2CC,-1C", header=FALSE)

splitstackshape:::read.concat(dat[, 1], "var", ",")

##  var_1 var_2 var_3
## 1   +1C            
## 2   +1C  +2CC      
## 3     0            
## 4   +1C  +2CC   -1C

第二种方式,但@ Matthew是一种更好的方法:

dat2 <- strsplit(as.character(dat[, 1]), ",")
lens <- sapply(dat2, length)
max(lens)
do.call(rbind, lapply(dat2, function(x) {
    x[max(lens)  + 1] <- NA
    x
}))[, -c(max(lens) + 1)]

##      [,1]  [,2]   [,3] 
## [1,] "+1C" NA     NA   
## [2,] "+1C" "+2CC" NA   
## [3,] "0"   NA     NA   
## [4,] "+1C" "+2CC" "-1C"