2016-04-04 21 views
0

Ben R yeni duyuyorum ve benim amiri bu kod sniplet var: öğrendim olarakortalaması (data.frame) geçersiz, alternatifler neler?

for (i in 1:k) mean.mat[i, ] <- mean(data.frame[i]) 

Ancak, değil artık çalışmaz veri çerçevelerinin anlamına gelir. Bu yüzden aşağıdaki solüsyon ile gelip çalıştı:

for (i in 1:k) mean.mat[i, ] <- lapply(norm.df[i], mean, na.rm = TRUE) 

Ama şu hata mesajı alıyorum:

Bu işe yaramazsa neden
Error in mean.mat[i, ] <- lapply(norm.df[i], mean, na.rm = TRUE) : incorrect number of subscripts on matrix 

bilen var mı ve ben mean() yerine nasıl işlev?

+3

'ortalama (data.frame [, i)) 'ilk' for' döngüsünde çünkü data.frame [i] 'hala bir data.frame ve bir' vector' değil. '' '' 'Vektör' üzerinde çalışır. Bir vektöre dönüştürmek için, 'i' önce ',' kullanın. İkinci seçenekte, "ben" seçeneği ve "for" döngüsü kullanıldığında gerekli değildir. "Lapply" yani "lapply (norm.df, mean, na.rm = TRUE)" – akrun

+0

Hızlı yardımınız için teşekkür ederiz. ! Ancak, (i: 1: k için) ilk çözümünü denediğimde, mean.mat [i,] <- mean (norm.df [, i]) yine de şu hatayı alıyorum: mean.mat dosyasında hata [i, ] <- mean (norm.df [, i]): matriste yanlış sayıda abonelik var. İkinci çözümü denediğimde aynı hatayı alıyorum ("matriste hatalı sayıda abonelik var.) – Sabrina

+0

" mean.mat <- numeric (ncol (norm.df)) 'i başlatmanız gerektiğini düşünüyorum ve daha sonra 'için seq_len (ncol (norm.df))) {mean.norm [i] <- ortalama (norm.df [, i], na.rm = TRUE)} ' – akrun

cevap

2

OP kodunda değişiklik yapılması gereken birkaç şey vardır.

  1. for döngü

    a. mean ile norm.df[i]'un kullanımı meandata.frame yerine vector olarak çalışmayacak. norm.df[i], , kullanırken ve vector'a dönüştürülecek rss'de sütun indeksini kullanırken hala data.frame'dur.

    b. Tüm sütunların mean bir vector için birleştirilebilir. Biz 'norm.df' arasında ncol eşit length ile çıktı vector yani 'mean.norm' başlatmak Yani, daha kolay

    mean.norm <- numeric(ncol(norm.df)) 
    

    c olacaktır. 'K' tanımlanıp tanımlanmadığı net değildir. durumda, kullanılan indeks mean.norm[i] yerine mean.norm[i,] olduğunu

    for(i in seq_len(ncol(norm.df))) { 
        mean.norm[i] <- mean(norm.df[,i], na.rm=TRUE) 
    } 
    

    Not değildir. İkincisi için, tek bir sütunla 'mean.norm' değerini matrix olarak başlatmamız gerekir. Sütun adlarında veya sütun numaralarına arasında döngü sürece herhangi endeksi gerekmez lapply içeren sütunlar Döngü

  2. lapply

    .

    lapply(norm.df, mean, na.rm=TRUE) 
    

yukarıdaki çıkışı list olacak, ama biz sapply

mean.norm <- sapply(norm.df, mean, na.rm=TRUE) 

Ya da kompakt ve verimli kod arıyorsanız, colMeans(norm.df, na.rm=TRUE) (a vector kullanımını gerekiyorsa @ Roland'ın yorumu)

0

Akullanılabilir @Akrun tarafından verilen lapply çözeltisi ile 210 tabanlı çözüm daha inline:

library(dplyr) 
library(tidyr) 
dat = data.frame(matrix(runif(100), 10, 10)) 
dat %>% gather(key, value) %>% group_by(key) %>% 
    summarise(mn = mean(value), stdev = sd(value)) 
Source: local data frame [10 x 3] 

     key  mn  stdev 
    (fctr)  (dbl)  (dbl) 
1  X1 0.2817435 0.2795313 
2  X2 0.4039304 0.3273860 
3  X3 0.4994540 0.2612170 
4  X4 0.4302393 0.3548886 
5  X5 0.4095109 0.3707861 
6  X6 0.4039782 0.2737998 
7  X7 0.3985275 0.3672740 
8  X8 0.5691146 0.2139044 
9  X9 0.5315091 0.2943599 
10 X10 0.5471878 0.3904215 

Uzun biçimine geniş verisetinin dönüştürmek için gather kullanın:

İhtiyacınız
dat %>% gather(key, value) %>% head(15) 
    key  value 
1 X1 0.12273665 
2 X1 0.04694209 
3 X1 0.06572691 
4 X1 0.87899058 
5 X1 0.40901575 
6 X1 0.63833813 
7 X1 0.09088830 
8 X1 0.18513657 
9 X1 0.10783958 
10 X1 0.27182005 
11 X2 0.54010596 
12 X2 0.03647860 
13 X2 0.78629356 
14 X2 0.96977616 
15 X2 0.54121128