首页 > 解决方案 > 用于创建数据框的 R 循环

问题描述

我在对象 my.ID 中有一个样本列表:

head(my.ID)

返回:

[1] PATL1 PATL2 PATL9 PCAN1 PCAN2 PCAN3
117 Levels: PATL1 PATL2 PATL9...

对于每个样本,我都有一个文件,名称如下:

Pi_Win5kb_JudDP_2020.04.29.vcf_PATL1.windowed.pi

中间是样品的名称(这里是 PATL1)

我想为每个样本创建一个数据框,其中第一列是样本的名称(例如 PATL1,在 my.ID 中列出),第二列是来自其关联数据框的名为 PI 的列(在我的例如:Pi_Win5kb_JudDP_2020.04.29.vcf_PATL1.windowed.pi$PI。

我尝试了多个循环,更改了一些东西但从未奏效。我认为这是因为我无法正确定义 data.frame 命令中的值。

有人可以告诉我如何更改循环以使其正常工作吗?

for (i in 1:(length(my.ID))){
  my.value <- noquote(paste0("Pi_Win5kb_JudDP_2020.04.29.vcf_",my.ID[i],".windowed.pi$PI"))
  cur.file <- data.frame(group=my.ID[i], value=as.name(my.value))
  my.name <- my.ID[i]
  assign(paste(my.name), cur.file)
}

标签: rloops

解决方案


生成一堆相似的对象不是一个好主意。使用该对象的列表!

对您来说(根据您的回答中的信息),它可能是:

my.files <- list.files(path="Pi1_vcftools_indv/results/", pattern = "Pi_")

my.samples <- read.table("../../Samples/JudDP_sample_info_VCFsorted.2020.05.12.txt", header=TRUE)
my.ID <- my.samples$ID

mydata3 <- function(IDi, filei) {
  cur.file <- read.table(file = paste0("Pi1_vcftools_indv/results/",filei), sep = "\t", h=T)
  data.frame(group=IDi, value=cur.file)
}
L <- mapply(mydata3, my.ID, my.files)
names(L) <- my.ID

这是使用的变体setwd()

my.samples <- read.table("../../Samples/JudDP_sample_info_VCFsorted.2020.05.12.txt", header=TRUE)
my.ID <- my.samples$ID

setwd("Pi1_vcftools_indv/results/")
my.files <- list.files(pattern = "Pi_")

mydata3 <- function(IDi, filei) {
  cur.file <- read.table(file=filei, sep = "\t", header=TRUE)
  data.frame(group=IDi, value=cur.file)
}
L <- mapply(mydata3, my.ID, my.files)
names(L) <- my.ID

推荐阅读