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..-(字面意思)

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 或类似 sum 的某种组合)。这就是我解释你的问题的方式:

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 回答