2

我有一个我想拆分的变量...每一行都是不同的,但它要么有 2 个字符串表达式,由“,”分隔;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])

任何帮助将不胜感激。

4

2 回答 2

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
于 2014-01-30T21:17:04.050 回答
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's 是一种更好的方法:

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"
于 2014-01-30T21:04:14.070 回答