2012-07-30 72 views
0

所以我的測試數據是這樣的:環R中,發現平均的一列依賴於另一列

structure(list(day = c(1L, 1L, 2L, 2L, 2L, 3L, 3L, 4L, 4L, 4L 
), Left = c(0.25, 0.33, 0, 0, 0.25, 0.33, 0.5, 0.33, 0.5, 0), 
    Left1 = c(NA, NA, 0, 0.5, 0.25, 0.33, 0.1, 0.33, 0.5, 0), 
    Middle = c(0, 0, 0.3, 0, 0.25, 0, 0.3, 0.33, 0, 0), Right = c(0.25, 
    0.33, 0.3, 0.5, 0.25, 0.33, 0.1, 0, 0, 0.25), Right1 = c(0.5, 
    0.33, 0.3, 0, 0, 0, 0, 0, 0, 0.75), Side = structure(c(2L, 
    2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L), .Label = c("L", "R"), class = "factor")), .Names = c("day", 
"Left", "Left1", "Middle", "Right", "Right1", "Side"), class = "data.frame", row.names = c(NA, 
-10L)) 

或本:

day Left Left1 Middle Right Right1 Side 
    1 0.25 NA 0.00 0.25 0.50 R 
    1 0.33 NA 0.00 0.33 0.33 R 
    2 0.00 0.00 0.30 0.30 0.30 R 
    2 0.00 0.50 0.00 0.50 0.00 R 
    2 0.25 0.25 0.25 0.25 0.00 L 
    3 0.33 0.33 0.00 0.33 0.00 L 

我想編寫一個循環找到標準的錯誤和所選擇的一側,每天平均值..

行..到目前爲止,我有這樣的代碼:

td<-read.csv('test data.csv') 

IDs<-unique(td$day) 

se<-function(x) sqrt(var(x)/length(x)) 

for (i in 1:length (IDs)) { 


day.i<-which(td$day==IDs[i]) 
td.i<-td[day.i,] 

if(td$Side=='L'){ 
side<-cbind(td.i$Left + td.i$Left1) 
}else{ 
side<-cbind(td.i$Right + td.i$Right1) 
} 

mean(side) 
se(side) 

print(mean) 
print(se) 

} 

但我收到錯誤消息像這樣

錯誤:意外「}」在「}」

很顯然,我還沒有得到每天打印出來的手段..有誰知道爲什麼?

也正在這裏的東西:http://www.talkstats.com/showthread.php/27187-Writing-a-mean-loop..-(literally

+0

要清楚:在真實數據中,每天會有多行嗎? – 2012-07-30 20:01:51

+0

是的..每天都有幾行 – 2012-07-30 21:13:44

+0

如果沒有偏好怎麼辦?例如兩個「R」和兩個「L」在任何給定的日期 – 2012-07-30 21:35:02

回答

0

仍然不能完全肯定,如果我的理解(也就是,如果你想的意思和SE兩種左後1或某種類似和結合的)。我這是怎麼解釋你的問題:

FUN <- function(dat, side = "L") { 
    DF <- split(dat, dat$Side)[[side]] 
    ind <- if(side=="L") 2:3 else 5:6 
    stderr <- function(x) sqrt(var(x)/length(x)) 
    meanNse <- function(x) c(mean=mean(x), se=stderr(x)) 
    OUT <- aggregate(DF[, ind], list(DF[, 1]), meanNse) 
    names(OUT)[1] <- "day" 
    return(OUT) 
} 

#test it 
FUN(td) 
FUN(td, "R") 

其中產量:

> FUN(td) 
    day Left.mean Left.se Left1.mean Left1.se 
1 2  0.250  NA  0.250  NA 
2 3  0.415 0.085  0.215 0.115 
3 4  0.415 0.085  0.415 0.085 
> FUN(td, "R") 
    day Right.mean Right.se Right1.mean Right1.se 
1 1  0.29  0.04  0.415  0.085 
2 2  0.40  0.10  0.150  0.150 
3 4  0.25  NA  0.750  NA 
+0

我只需要所選方的平均值和SE。所以如果td $ side =='R'那麼我需要cbind的平均值(Right + Right1),如果td $ side =='L'那麼我需要每天的cbind(Left + Left1)的平均值... – 2012-07-30 21:16:41

+0

這是有幫助的,我想以某種方式編寫'If'然後'語句來查找'Left'total和'Right'是選擇的一方。 – 2012-07-30 21:18:50

+0

這有效,但你必須修改你想要運行的每個不同功能的功能。我決定將數據拆分成一個列表。 – A5C1D2H2I1M1N2O1R2T1 2012-07-31 07:50:46

1

您的數據轉換成一個列表,並努力與替代:

首先,請將數據拆分成一個列表根據Side,沿途相關列的子集。

td = split(td, td$Side) 
NAMES = names(td) 
td = lapply(1:length(td), 
      function(x) td[[x]][c(1, grep(NAMES[x], 
              names(td[[x]])))]) 
names(td) = NAMES 
td 
# $L 
# day Left Left1 
# 5 2 0.25 0.25 
# 6 3 0.33 0.33 
# 7 3 0.50 0.10 
# 8 4 0.33 0.33 
# 9 4 0.50 0.50 
# 
# $R 
# day Right Right1 
# 1 1 0.25 0.50 
# 2 1 0.33 0.33 
# 3 2 0.30 0.30 
# 4 2 0.50 0.00 
# 10 4 0.25 0.75 

然後,使用lapplyaggregate到任何你想要的功能,適用於您的數據。

lapply(1:length(td), 
     function(x) aggregate(list(td[[x]][-1]), 
          list(day = td[[x]]$day), mean)) 
# [[1]] 
# day Left Left1 
# 1 2 0.250 0.250 
# 2 3 0.415 0.215 
# 3 4 0.415 0.415 
# 
# [[2]] 
# day Right Right1 
# 1 1 0.29 0.415 
# 2 2 0.40 0.150 
# 3 4 0.25 0.750 
+0

我不明白反對票。 (我最好反擊它。) – 2012-08-01 01:39:42

+0

@DWin,謝謝。我也沒有。但是再次,我不確定我是否完全理解這個問題! – A5C1D2H2I1M1N2O1R2T1 2012-08-01 06:29:32