Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于R中向量的循环特定元素_R - Fatal编程技术网

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

对于R中向量的循环特定元素,r,R,我想运行一个for循环,它只对数据帧中某列的特定元素进行计算。这些元素从矩阵中的相邻列引用。我可以通过目视观察哪些元素对应于值来实现这一点,例如,在301个元素的列中,{#(I in 1:5)的。但是,我希望能够在不预先知道元素编号的情况下指定这一点 e、 g.在下面的数据框中,我想在data.LICOR$fluxwhendata.LICOR$day.night=='d' data.LICOR.day.night data.LICOR.flux 1 d

我想运行一个for循环,它只对数据帧中某列的特定元素进行计算。这些元素从矩阵中的相邻列引用。我可以通过目视观察哪些元素对应于值来实现这一点,例如,在301个元素的列中,{#(I in 1:5)的
。但是,我希望能够在不预先知道元素编号的情况下指定这一点

e、 g.在下面的数据框中,我想在
data.LICOR$flux
when
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
这是我以前的代码所做的,它指定了元素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 
}
#替换日流量
(我在1:5中){
如果(data.LICOR$flux[i]>av.day.flux+2*sd.day.flux)

data.LICOR$flux[i]使用
subset
函数获取所需数据帧的子集。例如,如果
df
是原始数据帧,则可以执行以下操作:

df.d <- subset(df, day.night == 'd')

我使用的是你列名的缩写版本,但我相信你明白了。如果你事先知道平均值和std偏差的“正确”级别,你可以用这些值替换上述代码中的
平均值(通量)
sd(通量)

你可以使用以下方法获得子集:

subset(data.YSI, subset = day.night == "d")

但是现在告诉我们您想用它做什么?

鉴于您对Gavin答案的评论中的循环,我认为您需要类似的东西(假设您的示例数据位于名为
data.LICOR
的对象中)

#in()允许我们计算所有表达式(第二个参数)
#使用“data.LICOR”中的数据。

data.LICORUlrich提供的最后两行答案的另一种可能性是:

 flux[which(flux> av.flux+2*sd.flux & flux < av.flux-2*sd.flux)] <- av.flux

注意这里的修改是:for语句中which的使用和因子的使用。

建议1)提供更多信息,以便我们可以帮助您避免不必要的for循环。您想在for循环中做什么?很可能您根本不需要循环,可以对
data.YSI由
subset(data.YSI,subset=day.night==“d”)
给出,请在发布数据/代码时使用代码示例按钮。它看起来像
{}
,这将使您的数据/代码更具可读性。好的,谢谢这是我试图做的:for(I in 1:127){if(data.LICOR$flux[I]>av.day.flux+2*sd.day.flux)data.LICOR$flux[I]@Gab_27:哎哟,我的眼睛很痛!请在原始问题中发布此消息:)@Gab_27 blimey,你能编辑你的Q以包含此代码并将其隔开以使其可读吗!不过,从外观上看,你想要的操作应该相对容易实现矢量化抱歉,我是新加入此论坛的。我已经修改了此问题。谢谢…真的我支持你的评论,询问OP他们打算对“for循环”做什么,这样我们就可以帮助他们无循环地做……这可能是更有趣的问题了!对于(1:127中的I){if(data.LICOR$flux[I]>av.day.flux+2*sd.day.flux)data.LICOR$flux[I]因此,我需要将数据帧分为subset=day.night=='d'和subset=day.night=='n'。这也可能吗?嗨,我稍微简化了这个问题。在这段代码中,删除的值在哪里被平均值替换了?谢谢你的帮助。@Gab_27:最后两行可以做到。
ifelse
是一种矢量化的元素对元素进行比较的方法re-objects。我将在我的答案中添加一些注释……太棒了。这是一种非常简洁的方法,可以实现for循环之前所做的。再次感谢您的帮助。@Gab_27最后一行使用
ifelse(…
表示如果通量大于通量平均值的sd的2倍,或者
是“或”)大于通量sd的2倍小于平均值,返回
av.flux
,如果不是,返回
flux
,观察到的数据。如果没有矢量化的方法,R中的循环没有问题,并且在进入循环之前预先分配足够的存储。你是对的Gavin。我的意思是循环不是一种好的做法如果可以矢量化,我会编辑我的答案,谢谢。
# 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) })
 flux[which(flux> av.flux+2*sd.flux & flux < av.flux-2*sd.flux)] <- av.flux
for (i in unique(data.Licor$day.night) { 
      if (data.LICOR$flux[which(data.LICOR$day.night==i)] > ...