通过文本标题将数字行数据拆分为新列

时间:2013-04-18 22:11:02

标签: r

我对R中的数据操作有疑问。我试图分析的“.csv”文件包含2列,但每列中有多种类型的数据。数据类型由段落分隔。如下。

"A","B"
1,2
3,4

"C","D"
5,6
7,8

"E","F"
9,10
11,12

我想转换数据,以便每个数据集成为一列。例如,我希望将上述内容转换为:

"A","B","C","D","E","F"
1,2,5,6,9,10
3,4,7,8,11,12

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

您可以按\n\n分割文字,然后使用read.csv然后cbind结果

txt <- '"A","B"
1,2
3,4

"C","D"
5,6
7,8

"E","F"
9,10
11,12'

do.call(cbind, lapply(unlist(strsplit(txt, split='\n\n')), function(x) read.csv(text=x)))

##  A B C D  E  F
##  1 1 2 5 6  9 10
##  2 3 4 7 8 11 12

此外,如果您必须将文件中的内容作为1个字符串读取,则可以使用

进行
txt <- readChar('temp.txt', nchars=file.info('temp.txt')$size)
txt
##  [1] "\"A\",\"B\"\r\n1,2\r\n3,4\r\n\r\n\"C\",\"D\"\r\n5,6\r\n7,8\r\n\r\n\"E\",\"F\"\r\n9,10\r\n11,12"

答案 1 :(得分:0)

您可以使用回收来选择1,4,7行...然后2,5,8行等... 例如:

  (1:9)[c(TRUE,FALSE,FALSE)]
[1] 1 4 7
> (1:9)[c(FALSE,TRUE,FALSE)]
[1] 2 5 8
> (1:9)[c(FALSE,FALSE,TRUE)]
[1] 3 6 9

您可以使用您的数据:

dat <- read.table(text='"A","B"
1,2
3,4

"C","D"
5,6
7,8

"E","F"
9,10
11,12',sep=',')


 rbind(
  as.character(unlist(dat[c(TRUE,FALSE,FALSE),])),
unlist(dat[c(FALSE,TRUE,FALSE),]),
unlist(dat[c(FALSE,FALSE,TRUE),]))


    V11 V12 V13 V21  V22  V23 
[1,] "A" "C" "E" "B"  "D"  "F" 
[2,] "1" "4" "6" "12" "14" "10"
[3,] "3" "5" "2" "13" "15" "11"