मेरे पास इस तरह एक डेटाफ्रेम है:

tmp <- read.table(header = T, text = "gene_id   gene_symbol ensembl_id  keep val1   val2    val3
x   a   Multiple    Yes 1   2   3
                  x1    a   Multiple    No  2   3   4
                  x2    a   Multiple    No  1   4   3
                  y b   Multiple    Yes 22  20  12
                  y1    b   Multiple    No  98  7   97
                  y2    b   Multiple    No  8   76  6")

मैं gene_symbol चर द्वारा समूह बनाने की कोशिश कर रहा हूं और प्रत्येक पंक्ति के बीच सहसंबंध की गणना कर रहा हूं जो keep == "Yes" अन्य सभी पंक्तियों (keep == "No") के साथ है और gene_symbol के साथ एक औसत सहसंबंध लौटा रहा है। और gene_id। यह कार्य है:

# function to calculate avg. correlation
calc.mean.corr <- function(x){
  gene.id <- x[which(x$keep == "Yes"),"gene_id"]
  x1 <- x %>% 
    filter(keep == "Yes") %>%
    select(-c(gene_id, gene_symbol, ensembl_id, keep)) %>%
    as.numeric()
  x2 <- x %>% 
    filter(keep == "No") %>%
    select(-c(gene_id, gene_symbol, ensembl_id, keep))

  # correlation of kept id with discarded ids
  cor <- mean(apply(x2, 1, FUN = function(y) cor(x1, y)))
  cor <- round(cor, digits = 2)
  df <- data.frame(avg.cor = cor, gene_id = gene.id)
  return(df)
}

# call using ddply
for.corr <- plyr::ddply(tmp, .variables = "gene_symbol", .fun = function(x) calc.mean.corr(x))

अंतिम आउटपुट इस तरह दिखता है:

> for.corr
  gene_symbol avg.cor gene_id
1           a    0.83       x
2           b    0.02       y

मैं इसके लिए plyr::ddply का उपयोग कर रहा हूं लेकिन इसके बजाय dplyr का उपयोग करना चाहता हूं। हालांकि, मुझे यकीन नहीं है कि इसे dplyr प्रारूप में कैसे परिवर्तित किया जाए। कोई भी सहायताकाफी प्रशंसनीय होगी।

1
Komal Rathi 26 नवम्बर 2019, 01:13

1 उत्तर

सबसे बढ़िया उत्तर

यदि हम फ़ंक्शन को बदलना नहीं चाहते हैं, तो एक विकल्प इसे group_split करना है और फ़ंक्शन को लागू करना है

library(dplyr)
library(purrr)
tmp %>%
   group_split(gene_symbol) %>%
   map_dfr(calc.mean.corr)

gene_symbol शामिल करने के लिए

tmp %>%
    split(.$gene_symbol) %>%
    map_dfr(~ calc.mean.corr(.), .id = 'gene_symbol')
#    gene_symbol avg.cor gene_id
#1           a    0.83       x
#2           b    0.02       y
2
akrun 26 नवम्बर 2019, 01:25