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