Как применить / l oop ту же функцию к группе похожих объектов в R - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть большая таблица данных, содержащая метаданные, такие как различные виды лечения наркотиками для образцов при различных условиях и числа c особенности измерений.

Мини-набор фиктивных данных:

#I only used one sample here for simplicity. You can image there are multiple sample IDs
#and sometimes the same ID but different timestamp. 
#for each sample, the sample will have 3 levels conditions, 
#for each treatment(here's only 1, R), multiple dosages per condition
#on top of the condition&dose there is next layer to have combo or not.
#from id ~combo they are factors or at least I believe so
#after all these, the real measured variables V1,2.....

set.seed(123)
id <- rep("S112",30)  
timestamp <- rep("T4",30)
condit <- rep(c("uns","2S","3S"), 10)
treatment <- rep("R", 30)
dose <- rep(c("0.1","1"),each=15)
combo <-rep(c("none","I10","I100"),each=10)
v1 <-rnorm(30,0.5)
v2 <-rnorm(30,0.05)
v3 <-rnorm(30,0.1)
df <- data.frame(id,timestamp,condit,treatment,dose,combo,v1,v2,v3)

сейчас если я могу визуализировать одно лечение R, в разных условиях и в разных дозировках и даже в комбинации.

#import libs
library(ggplot2)
library(dplyr)
library(tidyr)
library(wesanderson)  #I have great movie taste I know

# now I look at treatment of interest
R <- df[df$treatment=="R" & df$combo == "I10",]

#table to long
R_long <- gather(R,7:9, key = bin, value = value, -id, -timestamp, -condit )
#plot it
b<- ggplot(R_long, aes(x=bin, y=id,fill=value))
pal <- wes_palette("Zissou1", 100, type = "continuous")
R_map <- b + 
  geom_tile()+
  scale_fill_gradientn(colors=pal)+
  facet_grid(dose~condit)+
  theme(text = element_text(size = 40,face="bold")) +
  theme(legend.text = element_text(size=35, face="bold"))+
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  theme(legend.key.size = unit(2, "cm"))+
  xlab("Bins")+
  ylab("Sample ID")+
  ggtitle("Plot of treatment R")

  ggsave(R_map,file="R.pdf",width=30,height=30) 

Это работает, но я хочу выполнить то же самое для группы лекарств в реальном наборе данных, вместо одного лечения R. Я предполагаю, что векторизованный язык R должен позволять что-то вроде группы обработки, которые я хочу в векторе c (R1, R2, R3, R4) и применить вышеупомянутый код к этому вектору. Как я могу этого достичь?

Примечание: извините за этот плохо сформулированный вопрос. Честно говоря, я слишком умный, чтобы даже задавать ключевые вопросы. Поэтому не стесняйтесь помочь мне отредактировать это (часть COVID для хорошего духа)

Спасибо

Ответы [ 2 ]

2 голосов
/ 07 апреля 2020

Вы также можете использовать map или map2 из purrr

Вот пример с map2, который позволит вам добавить еще одну переменную из вектора, например, combo:

library(purrr)

#get data
set.seed(123)
id <- rep("S112",30)  
timestamp <- rep("T4",30)
condit <- rep(c("uns","2S","3S"), 10)
treatment <- rep("R", 30)
dose <- rep(c("0.1","1"),each=15)
combo <-rep(c("none","I10","I100"),each=10)
v1 <-rnorm(30,0.5)
v2 <-rnorm(30,0.05)
v3 <-rnorm(30,0.1)
df <- data.frame(id,timestamp,condit,treatment,dose,combo,v1,v2,v3)


# make function if you use map, just remove y from the function and replace y with a variable within the function definition
makeplot <- function(x,y) {

# get data
R <- df[df$treatment==x & df$combo %in% unlist(strsplit(y, split="|", fixed=TRUE)),] #allows or statements in the vector
R_long <- gather(R, 7:9, key = bin, value = value, -id, -timestamp, -condit)
# make plot
pal <- wes_palette("Zissou1", 100, type = "continuous")
R_map <- ggplot(R_long, aes(x=bin, y=id, fill=value)) + 
  geom_tile() +
  scale_fill_gradientn(colors = pal) +
  facet_grid(dose ~ condit) +
  theme(text = element_text(size = 40, face="bold")) +
  theme(legend.text = element_text(size = 35, face = "bold")) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  theme(legend.key.size = unit(2, "cm")) +
  xlab("Bins") +
  ylab("Sample ID") +
  ggtitle(paste("Plot of treatment", x))
ggsave(R_map, file = paste0(x,"_",paste0(gsub("|","_",y,fixed=TRUE)), ".pdf"), width = 30, height = 30) 
}

#make vectors, the function above allows you to combine combos with |
treatment <- c("R","R","R")
combo <- c("none","I10","none|I10")

#apply
map2(treatment,combo,makeplot)

PS: Я надеюсь, что ваше исследование поможет найти эффективное лечение не по назначению для пациентов с COVID-19.

1 голос
/ 07 апреля 2020

Поскольку вы уже facet ed, вы не можете go в этом направлении, но если вы хотите один препарат на 1 oop, то оберните его в for l oop:

for (tr in unique(df$treatment)) {
  R <- df[df$treatment==tr & df$combo == "I10",]
  R_long <- gather(R, 7:9, key = bin, value = value, -id, -timestamp, -condit)
  #plot it
  pal <- wes_palette("Zissou1", 100, type = "continuous")
  R_map <- ggplot(R_long, aes(x=bin, y=id, fill=value)) + 
    geom_tile() +
    scale_fill_gradientn(colors = pal) +
    facet_grid(dose ~ condit) +
    theme(text = element_text(size = 40, face="bold")) +
    theme(legend.text = element_text(size = 35, face = "bold")) +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    theme(legend.key.size = unit(2, "cm")) +
    xlab("Bins") +
    ylab("Sample ID") +
    ggtitle(paste("Plot of treatment", tr))
  ggsave(R_map, file = paste0(tr, ".pdf"), width = 30, height = 30) 
}
...