我想运行一个for循环,它只对数据框中某列的特定元素进行计算.元素从矩阵中的相邻列引用.我可以通过直观地观察哪些元素对应于值来做到这一点 - 例如for(i in 1:5){ #在301个元素的列中.但是,我希望能够在没有对元素数字的先验知识的情况下指定它.
例如在以下的数据帧欲在柱的元素运行一个for循环data.LICOR$flux时data.LICOR$day.night=='d'
data.LICOR.day.night data.LICOR.flux
1 d 26.89
2 d 27.89
3 d 28.77
4 d 28.92
5 d 29.30
6 n 28.51
7 n 28.98
8 n 28.41
9 n 27.87
10 n 28.18
Run Code Online (Sandbox Code Playgroud)
这是我之前的代码所做的,通过指定元素1:5和6:10分别对应于day.night ='d'和day.night ='n'
# replace day fluxes
for(i in 1:5){
if(data.LICOR$flux[i] > av.day.flux+2*sd.day.flux)
data.LICOR$flux[i] <- av.day.flux
else if(data.LICOR$flux[i] < av.day.flux-2*sd.day.flux)
data.LICOR$flux[i] <- av.day.flux
}
# replace night fluxes
for(i in 6:10){
if(data.LICOR$flux[i] > av.night.flux+2*sd.night.flux)
data.LICOR$flux[i] <- av.night.flux
else if(data.LICOR$flux[i] < av.night.flux-2*sd.night.flux)
data.LICOR$flux[i] <- av.night.flux
}
Run Code Online (Sandbox Code Playgroud)
这将从平均值中删除大于2个标准差的值,并将其替换为平均值.
谢谢你的任何建议.
考虑到你对Gavin的回答的评论中的循环,我认为你想要这样的东西(假设你的示例数据在一个名为的对象中data.LICOR).
# within() allows us to evaluate all the expressions (the 2nd argument)
# using the data in 'data.LICOR'.
data.LICOR <- within(data.LICOR, {
# ave() applies 'FUN' to the subsets of 'flux' specified by 'day.night'
# and returns an object the same length as 'flux'.
av.flux <- ave(flux, day.night, FUN=mean);
sd.flux <- ave(flux, day.night, FUN=sd);
# ifelse() returns 'av.flux' when the first argument is TRUE
# and 'flux' when it's FALSE.
flux <- ifelse(flux > av.flux+2*sd.flux |
flux < av.flux-2*sd.flux, av.flux, flux) })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3025 次 |
| 最近记录: |