Как написать цикл, который использует функцию суммирования на разделенном фрейме данных? - PullRequest
0 голосов
/ 04 июля 2019

Я новичок в циклах и функциях в R.

Цель : у меня есть фрейм данных, который я хотел разделить на несколько фреймов данных на основе определенного набора идентификаторов.Затем я хочу суммировать каждый разделенный фрейм данных и хотел бы использовать цикл для этого.

Первое, что я сделал, я разделил фрейм данных на основе Tissue и Genes.Например:

Sb_qPCR <- split(Sb_qPCR, list(Sb_qPCR$Tissue, Sb_qPCR$Gene))

Это было успешно.Я получил список, в котором мой исходный фрейм данных был разбит на более мелкие фреймы данных в соответствии с уникальными генами и тканями.

Далее я хотел бы суммировать каждый отдельный кадр данных (эти разделенные кадры данных еще называют кадрами данных?) И сохранить итоговый вывод.Я успешно суммировал каждый отдельный фрейм данных с помощью функции summarySE, которую я нашел в Интернете.Я могу использовать функцию summarySE для каждого отдельного фрейма данных, если вызываю его по отдельности.Например, вот функция сводки:

summarySE <- function(data=NULL, measurevar, groupvars=NULL, na.rm=FALSE,
                  conf.interval=.95, .drop=TRUE){
library(plyr)

# New version of length which can handle NA's: if na.rm==T, don't count them
length2 <- function (x, na.rm=FALSE) {
if (na.rm) sum(!is.na(x))
else       length(x)
}

# This does the summary. For each group's data frame, return a vector with
# N, mean, and sd
datac <- ddply(data, groupvars, .drop=.drop,
           .fun = function(xx, col) {
             c(N    = length2(xx[[col]], na.rm=na.rm),
               mean = mean   (xx[[col]], na.rm=na.rm),
               sd   = sd     (xx[[col]], na.rm=na.rm)
             )
           },
           measurevar
)

# Rename the "mean" column    
datac <- rename(datac, c("mean" = measurevar))

datac$se <- datac$sd / sqrt(datac$N)  # Calculate standard error of the mean

# Confidence interval multiplier for standard error
# Calculate t-statistic for confidence interval: 
# e.g., if conf.interval is .95, use .975 (above/below), and use df=N-1
ciMult <- qt(conf.interval/2 + .5, datac$N-1)
datac$ci <- datac$se * ciMult

return(datac)
} 

Я могу выполнить эту функцию следующим образом:

RT.NHX2.sum <-summarySE(Sb_qPCR$RT.NHX2,measurevar="Ct",groupvars = c("Time","ID"))

Поскольку у меня много отдельных фреймов данных в моем фрейме раздельных данных, яхотел написать цикл для запуска функции summarySE в каждом разделе разделенного фрейма данных, но не мог понять, как это сделать.Возможно ли это?

РЕДАКТИРОВАТЬ

Вот пример данных, с которыми я работаю:

   > dput(head(Sb_qPCR,5))
    structure(list(ID = structure(c(4L, 4L, 4L, 2L, 2L), .Label = c("Sb1_Control", 
    "Sb1_Salt", "Sb10_Control", "Sb10_Salt"), class = "factor"), 
    Genotype = structure(c(2L, 2L, 2L, 1L, 1L), .Label = c("Sb1", 
    "Sb10"), class = "factor"), Tissue = structure(c(2L, 2L, 
    2L, 2L, 2L), .Label = c("L2", "RT", "TL"), class = "factor"), 
    Time = structure(c(1L, 1L, 1L, 1L, 1L), .Label = c("t-0m", 
    "t-12h", "t-1h", "t-24h", "t-2h", "t-30m", "t-3d", "t-3h", 
    "t-6h"), class = "factor"), Gene = structure(c(3L, 3L, 3L, 
    3L, 3L), .Label = c("HKT3", "NHX2", "SOS1"), class = "factor"), 
    Treatment = structure(c(2L, 2L, 2L, 2L, 2L), .Label = c("Control", 
    "Salt"), class = "factor"), Ct = c(3.1334, 3.2518, 0.6313, 
    3.4878, 4.1403), Ct_Exp = c(3.1334, 3.2518, 0.6313, 3.4878, 
    4.1403), Ct_Cont = c(2.1029, 0.0167, 0.5565, 2.7948, 2.2366
    ), FC_raw = c(0.4895, 0.1062, 0.9495, 0.6186, 0.2673), FC_graph = c(-2.0427, 
    -9.4155, -1.0532, -1.6166, -3.7416)), row.names = c(NA, 5L
    ), class = "data.frame")

Первый шаг, который я сделал, былрасщепление фрейма данных.Я сделал это следующим образом:

  Sb_qPCR <- split(Sb_qPCR, list(Sb_qPCR$Tissue, Sb_qPCR$Gene))

Это то, что мои разделенные фреймы данных называются:

  > names(Sb_qPCR)
   [1] "L2.HKT3" "RT.HKT3" "TL.HKT3" "L2.NHX2" "RT.NHX2" "TL.NHX2"    "L2.SOS1" "RT.SOS1"
   [9] "TL.SOS1"

Далее я хочу использовать функцию summarySE, показанную выше, для суммирования каждого фрейма данных, т.е. L2.HKT3 и сохраните вывод как новый фрейм данных.Я могу добиться этого с помощью этого кода:

    RT_SOS1.sum <-summarySE(Sb_qPCR$RT.SOS1,measurevar="Ct",groupvars = c("Time","ID"))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...