0

したがって、私のテストデータは次のようになります。

   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 )

4

2 に答える 2

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

次に、 と を使用lapplyして、aggregate必要な関数をデータに適用します。

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
于 2012-07-31T07:49:17.623 に答える
0

私が理解しているかどうかはまだ完全にはわかりません(つまり、LeftとLeft 1の両方の平均とSE、または合計のようなある種の組み合わせが必要な場合)。これが私があなたの質問をどのように解釈したかです:

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
于 2012-07-30T20:13:47.347 に答える