2015-04-20 2 views
-1

Есть ли быстрый способ вычислить среднее значение и sd вектора чисел, а затем собрать его вместе в data.frame? Поэтому предположим, у меня есть несколько переменных, которые выглядят как-то этогоВычисление итоговой статистики data.frame

test1 = data.frame(score = c(rnorm(10)), status = c(rep(0, 6), rep(1, 4))) 
test2 = data.frame(score = c(rnorm(10)), status = c(rep(0, 6), rep(1, 4))) 
test3 = data.frame(score = c(rnorm(10)), status = c(rep(0, 6), rep(1, 4))) 

> test1 
    score status 
1 0.6648  0 
2 -0.5158  0 
3 -0.0297  0 
4 -0.1086  0 
5 -1.8708  0 
6 0.7908  0 
7 0.4760  1 
8 -0.4841  1 
9 -0.3451  1 
10 -0.0772  1 

Как я могу построить data.frame, который выглядит примерно так со средним (SD) в каждой записи. Я смутно помню, что я сделал это раньше с какой-то командой, но я просто не могу вспомнить, что это такое. И я не хочу означать() и sd() каждую переменную, а затем объединять их в data.frame отдельно. Итак, вот что я хочу, чтобы последний файл data.frame выглядел; что-то долго линии:

    0   1 
test1  0.9(0.1) 0.1(0.03) 
test2  0.2(0.1) 0.2(0.03) 
test3  0.1(0.2) 0.1(0.04) 
+0

В test1, как вы получили положительные средние значения? – PoGibas

+0

Я только что сделал значения. Я просто хотел показать, как должен выглядеть df. – Adrian

ответ

2

Ниже мое испытание.

myfun() получить mean(sd) для обоих столбцов (или любого количества столбцов). кадры данных помещаются в список для использования в sapply().

set.seed(1237) 
test1 = data.frame(score = c(rnorm(10)), status = c(rep(0, 6), rep(1, 4))) 
test2 = data.frame(score = c(rnorm(10)), status = c(rep(0, 6), rep(1, 4))) 
test3 = data.frame(score = c(rnorm(10)), status = c(rep(0, 6), rep(1, 4))) 

tests <- list(test1, test2, test3) 

myfun <- function(x) { 
    sapply(x, function(x) paste0(round(mean(x),1),"(",round(sd(x),1),")")) 
} 

t(sapply(tests, myfun)) 

    score  status  
[1,] "-0.2(1.1)" "0.4(0.5)" 
[2,] "0.3(1.2)" "0.4(0.5)" 
[3,] "0.1(0.9)" "0.4(0.5)" 
0
summarySE <- 
function (data = NULL, measurevar, groupvars = NULL, na.rm = TRUE, 
    conf.interval = 0.95, .drop = TRUE, dec = 2) 
{ 
    require(plyr) 
    length2 <- function(x, na.rm = FALSE) { 
     if (na.rm) 
      sum(!is.na(x)) 
     else length(x) 
    } 
    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) 
    datac <- rename(datac, c(mean = measurevar)) 
    datac$se <- datac$sd/sqrt(datac$N) 
    ciMult <- qt(conf.interval/2 + 0.5, datac$N - 1) 
    datac$ci <- datac$se * ciMult 
    datac[, measurevar] <- round(datac[, measurevar], dec) 
    datac$sd <- round(datac$sd, dec) 
    datac$se <- round(datac$se, dec) 
    datac$ci <- round(datac$ci, dec) 
    return(datac) 
} 

С here, модифицирована.

Теперь связать все и использовать summarySE:

dat <- rbind(test1, test2, test3) 

dat$ID <- rep(c("test1", "test2", "test3"), each = nrow(test1)) 

summarySE(dat, "score", c("ID", "status")) 

    ID status N score sd se ci 
1 test1  0 6 -0.59 0.56 0.23 0.59 
2 test1  1 4 0.36 2.10 1.05 3.34 
3 test2  0 6 -0.13 0.81 0.33 0.85 
4 test2  1 4 0.95 1.32 0.66 2.11 
5 test3  0 6 -0.27 0.55 0.23 0.58 
6 test3  1 4 0.05 0.99 0.50 1.58 
Смежные вопросы