基于文本文件自动化R

时间:2012-12-10 07:50:33

标签: r bash

我有一个格式为

的文本文件
>species1
0.432
0.323
0.987
(possibly continued...)
>species2
-0.332

依旧......

我有4个变量,totalcomsize, totalp, pol_pla, nvp_vp让我们说它们是常数,因此很容易硬编码。我怎样才能获取>species1下的所有值并将它们与上述4个变量中的每一个进行对比,然后保存名为species1_vs_variable的图,其中变量是上面的变量之一。我想用R和bash代码做这个,任何人都可以帮忙吗?


EDITED

好的,作为一个简短的例子,上面提到的4个变量对应于一组FIXED点,因此每个变量可以是[1, 2, 3, 4, 5]。以>开头的每一行表示有一组新数据要与上述4个变量中的每一个进行比较。因此>Species1可以是>Drosophila Melanogaster,并且其下面的每个数字都以新行分隔,该值包含在与D.Melanogaster相对应的该集合中。但是你基本上想要所有的值,直到下一行以>开头。所以你最终可能会得到一个物种[0.2, 0.4, 0.6]的物种果蝇(Drosophila melanogaster)。然后,您希望为每个4个固定变量(totalcomsize, totalp, pol_pla, nvp_vp)创建该数据集的线图,并保存图,为其提供与物种相对应的文件名。我想自动化这个,因为有很多种类。这意味着#species * 4图表可以手动绘制。所以你可以看到我为什么要这样做。我确实设法将它放在一个更好的格式中,其中物种在一条线上分开,例如

anthomyiidae_sp_2_NVP   anthomyiidae_sp_1_NVP   anthomyiidae_sp_3_NVP
-0.221                  0.188                   0.989
0.972                   0.092                   0.924

然后它们的值以制表符分隔格式显示在下一行,依此类推,直到没有更多值。我能够导入这个文件,这有点帮助。但我仍然可以使用一个好的建议。

2 个答案:

答案 0 :(得分:0)

很多评论都很清楚,你想做什么。

但是,我认为数据的特殊格式很有趣。由于您有按类别分组的数据格式的数据。您可以轻松地使用它们。

我使用特殊的分隔符读取数据:

dat <- read.table(text ='>species1
0.432
0.323
0.987
>species2
-0.332',sep ='>',fill=TRUE,colClasses=c('numeric','character'))
   dat
      V1       V2
1     NA species1
2  0.432         
3  0.323         
4  0.987         
5     NA species2
6 -0.332   

我尝试用之前的值

填补V2中的空白
L <-  dat$V2 != ''
idx <- c(NA,which(L))[cumsum(L)+1]
dat$V2 <- dat$V2[idx]
  dat
      V1       V2
1     NA species1
2  0.432 species1
3  0.323 species1
4  0.987 species1
5     NA species2
6 -0.332 species2

然后我删除NA值

dat <- na.omit(dat)

     V1       V2
2  0.432 species1
3  0.323 species1
4  0.987 species1
6 -0.332 species2

根据评论中的建议,您可以在spiecs

索引的列表上创建处理
library(plyr)
ll <- dlply(dat,.(V2),function(x) x$V1)
ll
$species1
[1] 0.432 0.323 0.987

$species2
[1] -0.332

答案 1 :(得分:0)

如果每个变量都有一个文件(假设你的文件以你的变量命名),我建议这样做:

vars <- c("totalcomsize", "totalp", "pol_pla", "nvp_vp")
for(v in vars){
    f <- readLines(paste(v, "txt", sep"."))
    index <- grep(">",f) # Spot lines that start with a >
    mat <- apply(cbind(index, c(index[-1]-1,length(f))), 1,
                        function(X){as.numeric(f[(X[1]+1):X[2]])})
    # break the file at each lines spotted in the preceding step
    names(res) <- gsub(">","",f[index]) # Names each element of the list according to the lines starting with >
    for(i in 1:length(res)){ # Loop to create a plot for each species vs each variable
        pdf(paste(names(res)[i],"_vs_", v, ".pdf",sep=""))
        plot(res[[i]])
        dev.off()
        }
    }

对于每个变量,res是表单列表:

res
$species1
[1] 0.432 0.323 0.987
$species2
[1] -0.332