Цикл 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)
}

person user236152    schedule 03.06.2020    source источник
comment
my.files <- paste0("Pi_Win5kb_JudDP_2020.04.29.vcf_",my.ID,".windowed.pi"), а затем result <- lapply(my.files, FUN=...) Функция в FUN= предназначена для работы с одним файлом (с заданным именем файла).   -  person jogo    schedule 03.06.2020
comment
Спасибо Джого за ответ. К сожалению, я все еще потерян! Теперь хорошо, у меня есть список файлов, но мне все еще не удается создать фрейм данных. Я действительно это делаю и не работаю для (i in 1:(length(my.ID))){my.files ‹- paste0(Pi_Win5kb_JudDP_2020.04.29.vcf_,my.ID,.windowed.pi) my.pi ‹- paste0 (my.files,$PI) cur.file ‹- data.frame(group=my.ID[i], value=as.name(my.pi)) my.name ‹- my.ID[i] assign( вставить(мое.имя), cur.файл) }   -  person user236152    schedule 03.06.2020
comment
Вот что-то похожее: stackoverflow.com/questions/9890209/   -  person jogo    schedule 03.06.2020
comment
Спасибо Джого. У меня нет проблем с чтением всех моих файлов. Они уже прочитаны с предыдущим циклом. Моя проблема заключается в создании dafarame, где имя идентификатора находится в первом столбце, а второе — в столбце PI из объекта Pi_Win5kb_JudDP_2020.04.29.vcf_PATL1.windowed.pi$PI (в случае образца PATL1)   -  person user236152    schedule 03.06.2020
comment
Как вы прочитали все фреймы данных? Не рекомендуется генерировать кучу похожих объектов. Используйте список для этих объектов!   -  person jogo    schedule 03.06.2020


Ответы (3)


Я могу неправильно понять ваш вопрос, но так ли это просто?

library(dplyr)
library(tibble)

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

дплир

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

базаR

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
person Paul van Oppen    schedule 03.06.2020

Нашел способ сделать это:

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)
}
person user236152    schedule 03.06.2020
comment
Я отредактировал свой ответ, чтобы отразить информацию, указанную в вашем ответе. - person jogo; 03.06.2020

Не рекомендуется генерировать кучу похожих объектов. Используйте список для этих объектов!

Для вас (с информацией из вашего ответа) это может быть:

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
person jogo    schedule 03.06.2020