2017-10-15 2 views
-1

私はみんな!ループと関数のエラーのためにR

私は博士研究のためにRの世界を発見しています。解析を簡略化するためにループを実装する際にいくつかの問題があります。

マイデータフレームは、次のとおりです。

'data.frame': 3581 obs. of 8 variables: 
$ Date   : Factor w/ 7 levels "03-03-17","10-02-17",..: 
$ Experimentator: Factor w/ 9 levels "BURLET","DECHAUD",..: 
$ Origin  : Factor w/ 3 levels "FRANCE","JAPAN",..: 
$ City   : Factor w/ 6 levels "MONTPELLIER",..: 
$ Lineage  : Factor w/ 27 levels "L21","L22","L26",..: 
$ Sex   : Factor w/ 2 levels "Female","Male": 
$ ccr   : int 1183 1813 1866 1745 1210 1463 2477 1506 

最初の6は私の要因と最後の私の量的変数です。で :それは私には難しいforループで

by(data$ccr, c(data$Date, data$Sex, data$Lineage), shapiro.test()) 
Error in tapply(seq_len(3581L), list(`c(data$Date, data$Sex, 
data$Lineage)` = c(2L, : the arguments must have the same length 

ので、私は書くことを試みた 私は例えばshapiro.testをしたいときは、同じ時間でいくつかの要因で作業する必要があります。私は私のループをインクリメントする方法がわからない

for(sex in levels(data$Sex)){ 
    for(date in levels(data$Date)){ 
    for(lineage in levels(data$Lineage)){ 
     shapiro.test(data$ccr[,lineage]) 
    } 
    } 
} 

府...任意の助け

ありがとうございました!

+0

でデータを受け入れることに注意してくださいあなたは、少なくともあなたがここで使用しているパッケージ(複数可)を教えなければなりません。 –

+0

すべての3581レコードが必要ですか? –

+1

'by'では、グループ化変数(' INDICES')は ''要因のリスト ''でなければなりません。 by(mtcars、list(mtcars $ vs、mtcars $)、function(dat)shapiro.test(dat $ mpg)) '(あなたの場合) am)、function(dat)shapiro.test(dat $ mpg)) 'を実行します。 – Henrik

答えて

0

あなたは、私はどちらかの最善の方法をby()機能を使用しているとは思わないR.でこれを行うために必要ではありません。この

index <- 1 

while(index != 3582){ 
    for(sex in levels(data$Sex)){ 
    for(date in levels(data$Date)){ 
     for(lineage in levels(data$Lineage)){ 
     shapiro.test(data$ccr[,lineage]) 
     index <- index + 1 
     } 
    } 
    } 
} 
1

forループのように実行するためにインデックスを使用することができます。 dplyrインフラストラクチャを使用することです最も簡単な方法:

library(dplyr)

data %>% 
    group_by(Sex, Date, Lineage) %>% 
    filter(n() > 2) %>% 
    summarise(shapiro_pvalue = shapiro.test(ccr)$p.value, 
      shapiro_stat = shapiro.test(ccr)$statistic) 

filter(n() > 2)shapiro.testが計算されるように、少なくとも3個のサンプルが必要であるという事実を扱います。 (良い再現性例えばRui Barradasにクレジット!)

dplyrbase Rとは全く異なりますが、あなたが博士号を開始し、Rを使用する必要がある場合、それはあなたがあなたの人生をより簡単にしたい場合は、それを使用して価値があります。

0

byの代わりにsplit/lapplyを使用します。
datdataがすでにR関数であるため、名前が変更された偽のデータが最初に表示されます。

set.seed(9235) # make it reproducible 
n <- 3581 
d <- seq(as.Date("2017-01-01"), as.Date("2017-12-31"), by = "day") 
d <- format(d, "%d-%m-%y") 
dat <- data.frame(
    Date = sample(d, n, TRUE), 
    Experimentator = sample(LETTERS[1:9], n, TRUE), 
    Origin = sample(LETTERS[11:13], n, TRUE), 
    Lineage = sample(paste0("L", 1:27), n, TRUE), 
    Sex = sample(c("F", "M"), n, TRUE), 
    ccr = sample(3000, n, TRUE) 
) 

コードが完成しました。 shapiro.testだけnumber of non-missing values must be between 3 and 5000.

sp <- split(dat$ccr, list(dat$Date, dat$Sex, dat$Lineage)) 
sp <- sp[which(sapply(sp, function(x) length(x) > 2))] 

result <- lapply(sp, shapiro.test) 
関連する問題