0

我有一个这样的制表符分隔文件:

RS1->2001 HAPLO1 AAACAAGGAGGAGAAGGAAA ...
RS1->2001 HAPLO2 CAACAAAGAGGAGAAGGAAA ...
RS1->2002 HAPLO1 AAAAAAGGAGGAAAAGGAAA ...
RS1->20020 HAPLO2 CAACAAGGAGGAAGCAGAGC ...
RS1->20021 HAPLO2 CAACAAGGAGGAAGCAGAGC ...

在 R 中,我们可以轻松阅读这三列,我的问题是我需要逐个字符分隔第三列。最终结果应该是这样的:

RS1->2001 HAPLO1 A A A C  ...
RS1->2001 HAPLO2 C A A C  ...
RS1->2002 HAPLO1 A A A A  ...
RS1->20020 HAPLO2 C A A C  ...
RS1->20021 HAPLO2 C A A C  ...

我可以先读取 3 列,然后将第 3 列的每个条目拆分为字符,但这很烦人,我非常希望从一开始就做好。

如果前两列不存在,我可以实现目标

read.fwf('test.csv', widths=rep(1, 300))

我正在考虑是否可以使用制表符分隔符读取前 2 列,然后以固定宽度读取第 3 列。

4

3 回答 3

1

想到的两个主要选项是strsplit(如评论和@Ricardo 的回答中所述)和read.fwf. 不会直接处理您的数据,但如果您使用该函数read.fwf,它可以处理已读入的数据列。textConnection()

这是一个基本示例:

## Create a tab-separated file named "test.txt" in your working directory
cat("2001\tHAPLO1\tAAACAAGGAGGAGAAGGAAA\n",
    "2001\tHAPLO2\tCAACAAAGAGGAGAAGGAAA\n",
    "2002\tHAPLO1\tAAAAAAGGAGGAAAAGGAAA\n",
    "20020\tHAPLO2\tCAACAAGGAGGAAGCAGAGC\n",
    "20021\tHAPLO2\tCAACAAGGAGGAAGCAGAGC\n", 
    file = "test.txt")

## Read it in with `read.delim`
mydata <- read.delim("test.txt", header = FALSE, stringsAsFactors = FALSE)

## Use `read.fwf` on the third column
## Replace "widths" with whatever the maximum width is for that column
## If max width is not known, you can use something like
##    `widths = rep(1, max(nchar(mydata$V3)))`
cbind(mydata[-3], 
      read.fwf(file = textConnection(mydata$V3), widths = rep(1, 20)))
#      V1     V2 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
# 1  2001 HAPLO1  A  A  A  C  A  A  G  G  A   G   G   A   G   A   A   G   G   A   A   A
# 2  2001 HAPLO2  C  A  A  C  A  A  A  G  A   G   G   A   G   A   A   G   G   A   A   A
# 3  2002 HAPLO1  A  A  A  A  A  A  G  G  A   G   G   A   A   A   A   G   G   A   A   A
# 4 20020 HAPLO2  C  A  A  C  A  A  G  G  A   G   G   A   A   G   C   A   G   A   G   C
# 5 20021 HAPLO2  C  A  A  C  A  A  G  G  A   G   G   A   A   G   C   A   G   A   G   C

注意:如果您不使用stringsAsFactors = FALSE,则必须将file参数更改为:

file = textConnection(as.character(mydata$V3))
于 2013-08-01T02:34:07.123 回答
1

正如@Ananda 在评论中所暗示的那样,strsplit如果要求拆分""将拆分每个字母。

fContents <- read.csv("/path/to/file.csv")

 # This will chop it up for you.
 strsplit(fContents[, 3], "")

为了结合它,使用 cbind

cbind(fContents[, -3],
       do.call(rbind, strsplit(fContents[, 3], ""))
      )

# or if you'd like to keep the columns ordered (and there are more than 3):
cbind(fContents[, 1:2], 
      do.call(rbind, strsplit(fContents[, 3], "")),
      fContents[, 4:ncol(fContents)]
)
于 2013-07-31T17:12:52.913 回答
0
import csv
file_read = csv.reader(open('/path/to/file.csv','r'),delimiter='\t')
file_write = csv.writer(open('/path/to/newfile.csv','w'),delimiter='\t')
for i in file_read:
    first=i[0]
    second=i[1]
    third = i[3]
    splitchar = [k for k in third]
    outputdata = [first,second,splitchar]
    file_write.writerow(outputdata)
于 2013-07-31T18:21:20.557 回答