-1

我有一个格式为的文本文件:

>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 代码来做到这一点,有人可以帮忙吗?


已编辑

好的,作为一个简短的示例,上面提到的 4 个变量对应于一组 FIXED 点,因此每个变量都可以是[1, 2, 3, 4, 5]例如。以 a 开头的每一行>表示有一组新数据要与上述 4 个变量中的每一个进行比较。>Species1也可能是>Drosophila Melanogaster,它下面的每个数字都由新行分隔,是包含在与 D.Melanogaster 对应的集合中的值。但是你基本上想要所有的值,直到下一行以 a 开头>。所以你最终可能会得到一套[0.2, 0.4, 0.6]黑腹果蝇。然后,您想为每 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

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

4

2 回答 2

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
于 2012-12-10T11:59:32.647 回答
0

正如许多评论很清楚,你想做什么。

但是,我认为数据的特殊格式很有趣。由于您有按物种分组的格式良好的 data.frame 中的数据,因此您可以轻松地使用它们。

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

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
于 2012-12-10T11:43:51.270 回答