用于创建数据帧的R循环

时间:2020-06-03 06:39:49

标签: r loops

我在对象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)
}

3 个答案:

答案 0 :(得分:0)

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

对于您(从您的答案中获得的信息),可能是:

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

答案 1 :(得分:0)

我可能会误解您的问题,但这是否就这么简单?

library(dplyr)
library(tibble)

cur.file <- tibble(
  group = as.factor(c("PATL1", "PATL2", "PATL9", "PCAN1", "PCAN2", "PCAN3"))
)

dplyr

cur.file <- cur.file %>%
  mutate(value = paste0("Pi_Win5kb_JudDP_2020.04.29.vcf_", group,".windowed.pi$PI"))

baseR

cur.file$value <- paste0("Pi_Win5kb_JudDP_2020.04.29.vcf_", cur.file$group, ".windowed.pi$PI")

结果如下:

> cur.file
# A tibble: 6 x 2
  group value                                              
  <fct> <chr>                                              
1 PATL1 Pi_Win5kb_JudDP_2020.04.29.vcf_PATL1.windowed.pi$PI
2 PATL2 Pi_Win5kb_JudDP_2020.04.29.vcf_PATL2.windowed.pi$PI
3 PATL9 Pi_Win5kb_JudDP_2020.04.29.vcf_PATL9.windowed.pi$PI
4 PCAN1 Pi_Win5kb_JudDP_2020.04.29.vcf_PCAN1.windowed.pi$PI
5 PCAN2 Pi_Win5kb_JudDP_2020.04.29.vcf_PCAN2.windowed.pi$PI
6 PCAN3 Pi_Win5kb_JudDP_2020.04.29.vcf_PCAN3.windowed.pi$PI

答案 2 :(得分:0)

找到了一种方法:

my.files <- list.files(path="Pi1_vcftools_indv/results/", pattern = "Pi_")
for (i in 1:(length(my.files))){
  my.samples <- read.table("../../Samples/JudDP_sample_info_VCFsorted.2020.05.12.txt",h=T); my.ID <- my.samples$ID
  cur.file <- read.table(file = paste0("Pi1_vcftools_indv/results/",my.files[i]), sep = "\t", h=T)
  my.df <- data.frame(group=my.ID[i], value=cur.file)
  my.name <- my.ID[i]
  assign(paste(my.name), my.df)
}