【发布时间】:2023-03-10 09:36:01
【问题描述】:
我有一个看起来像这样的大型数据库:
>tms
expId id date sessionNr waveSh ipi isi perc ampl qual eventNr
1 b80M1 myrthe 20131206 1 2 20 1 80 416.10 1 145
2 b80M1 myrthe 20131206 1 2 4 2 80 366.80 1 146
3 b80M1 myrthe 20131206 1 2 4 3 80 411.60 1 147
..... ...... ........ . . . . .. ...... . ...
..... ...... ........ . . . . .. ...... . ...
24 m80M1 myrthe 20131218 1 1 20 2 80 58.10 1 266
25 m80M1 myrthe 20131218 1 1 4 1 80 22.60 0 267
26 m80M1 myrthe 20131218 1 1 4 3 80 21.90 0 268
..... ...... ........ . . . . .. ...... . ...
..... ...... ........ . . . . .. ...... . ...
201 h80M1 myrthe 20131219 1 3 5 3 80 33.00 0 194
202 h80M1 myrthe 20131219 1 3 6 1 80 52.50 1 195
203 h80M1 myrthe 20131219 1 3 4 4 80 314.20 1 196
在每个 tms$expId 中,我想创建一个名为 tms$norm 的新变量。该变量表示 tms$ampl 与 tms$expId 内 tms$isi==1 的平均值之间的比率,即 tms$ampl/mean(tms[tms$isi==1,]$ampl)。
我可以像这样从长远来看,为每个 tms$expId 手动设置子集:
b80L1 <- tms[tms$expId==b80L1,]
attach(b80L1)
b80L1$norm <- b80L1$ampl/mean(b80L1[b80L1$isi==1,]$ampl)
detach(b80l1)
m80M1 <- tms[tms$expId==m80M1,]
attach(m80M1)
M80M1$norm <- M80M1$ampl/mean(m80M1[m80M1$isi==1,]$ampl)
detach(m80M1)
h80M1 <- h80M1[h80M1$expId==h80M1,]
attach(h80M1)
h80M1$norm <- h80M1$ampl/mean(h80M1[h80M1$isi==1,]$ampl)
detach(h80M1)
然后将所有子集再次组合到一个数据框中,如下所示:
tmsNorm <- rbind(b80L1,m80M1,h80M1)
那么 tmsNorm 数据库将如下所示:
>tmsNorm
expId id date sessionNr waveSh ipi isi perc ampl qual eventNr norm
1 b80M1 myrthe 20131206 1 2 20 1 80 416.10 1 145 0.6547
2 b80M1 myrthe 20131206 1 2 4 2 80 366.80 1 146 0.5667
3 b80M1 myrthe 20131206 1 2 4 3 80 411.60 1 147 0.6530
..... ...... ........ . . . . .. ...... . ... ...
..... ...... ........ . . . . .. ...... . ... ...
24 m80M1 myrthe 20131218 1 1 20 2 80 58.10 1 266 0.0123
25 m80M1 myrthe 20131218 1 1 4 1 80 22.60 0 267 0.0056
26 m80M1 myrthe 20131218 1 1 4 3 80 21.90 0 268 0.0057
..... ...... ........ . . . . .. ...... . ... ...
..... ...... ........ . . . . .. ...... . ... ...
201 h80M1 myrthe 20131219 1 3 5 3 80 33.00 0 194 0.0045
202 h80M1 myrthe 20131219 1 3 6 1 80 52.50 1 195 0.0053
203 h80M1 myrthe 20131219 1 3 4 4 80 314.20 1 196 0.0145
但是,由于我有大约 100 种类型的 tmse$expId,我真的很想使用循环函数或某种应用函数来创建这个 tms$norm 变量。
我尝试使用这个不起作用的代码,但希望能表明我想要实现的目标:
uniq <- unique(unlist(tms$expId))
> for(i in 1:length(uniq)){
attach(tms[tms$expId==uniq[i], ])
tms$normReal2 <- tms[tms$expId==uniq[i], ]$realAmpl/mean(tms[(tms$expId==uniq[i]) | (tms$isi==1),]$realAmpl)
detach(tms[tms$expId==uniq[i], ])
}
所以我的问题是:如何使用非常紧凑的代码创建这个 tms$norm 变量?
提前非常感谢您!
【问题讨论】:
-
看看
aggregate函数。 -
@user3233153 不清楚您是否对条件 isi==1 为真的数据子集或具有 NA 的完整数据集感兴趣
-
如果 isi==1,每个 expId,我对 ampl 的平均值感兴趣。所以在上面的数据框选择中,这将是 3 个值。