用于R中向量的循环特定元素

Rod*_*ger 2 r

我想运行一个for循环,它只对数据框中某列的特定元素进行计算.元素从矩阵中的相邻列引用.我可以通过直观地观察哪些元素对应于值来做到这一点 - 例如for(i in 1:5){ #在301个元素的列中.但是,我希望能够在没有对元素数字的先验知识的情况下指定它.

例如在以下的数据帧欲在柱的元素运行一个for循环data.LICOR$fluxdata.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个标准差的值,并将其替换为平均值.

谢谢你的任何建议.

Jos*_*ich 8

考虑到你对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)