R 循环,求一列的平均值取决于另一列

R 循环,求一列的平均值取决于另一列,r,loops,mean,R,Loops,Mean,因此,我的测试数据如下所示: 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

因此,我的测试数据如下所示:

   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)

}

td仍然不能完全确定我是否理解(也就是说,如果你想要左1和左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")

将数据转换为列表,然后使用该列表:

首先,根据
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
然后,使用
lappy
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

需要明确的是:在实际数据中,每天是否会有多行?是的。。每天都有几排如果没有偏好怎么办?e、 g.任何给定日期的两个“R”和两个“L”对于每一天,有几行条目。。每一行都是独立的。。。例如如果在第二天,有两个人选择右边,一个人选择左边。。我想找出三个的平均值。。我会把右边和右边的1绑定到'R'边上,把左边和左边的1绑定到'L'边上,然后找到这三个的平均值。。。然后,我会有一个平均值,每天花在选择的一方。。这有意义吗?我只需要选择的一方的平均值和SE。。因此,如果td$side=='R',那么我需要cbind的平均值(右+右1),如果td$side=='L',那么我需要cbind的平均值(左+左1)每天…这很有帮助,我想以某种方式编写和'if,then'语句,以找到“左”总计和“右”总计的平均值,只要这是选定的一侧。这很有效,但是,您必须为要运行的每个不同的函数修改函数。我决定把数据分成一个列表,我不明白投反对票的原因。(我尽了全力反击。)@DWin,谢谢。我也没有。但话说回来,我也不确定我是否完全理解这个问题!
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