2017-10-15 117 views
-1

我大家!For循環和功能錯誤與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是我的因素和最後我的定量變量。 我需要在同一時間幾個因素的工作,然後當我想做例如shapiro.test: 由:

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 

有了一個for循環很難給我,讓我試着寫:

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

BU我不知道如何來增加我的環...

感謝您的幫助!

+0

接收數據你至少應該告訴我們你在使用它在這裏封裝(S)。 –

+0

您需要所有3581條記錄? –

+1

在'by'中,分組變量('INDICES')應該是「一個_'列表因素」。比較'(mtcars,c(mtcars $ vs,mtcars $ am),function(dat)shapiro.test(dat $ mpg))''(您的情況),'by(mtcars,list(mtcars $ vs,mtcars $ am),函數(dat)shapiro.test(dat $ mpg))'。 – Henrik

回答

0

您可以使用索引來這樣

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循環運行是沒有必要爲此在R.我不使用by()功能是最好的辦法要麼認爲。最簡單的方法是使用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

你可以使用base R來代替by使用split/lapply
首先,一些虛假的數據,其名稱更改爲dat,因爲data已經是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)