在此示例中了解R语法

时间:2015-01-31 23:53:51

标签: r dataset stackexchange

Finding Peak in a dataset - using R

您好

我在stackexchange上看到了这个帖子。我还不是R程序员。但我想在C中实现。但是由于不熟悉R语法,我无法理解代码。我知道它创建的数组,如y.max和i.max,但我不确定操作是否完成以及如何操作数组。以下是我特别感兴趣的四条线。

  y.max <- rollapply(zoo(y.smooth), 2*w+1, max, align="center")
  delta <- y.max - y.smooth[-c(1:w, n+1-1:w)]
  i.max <- which(delta <= 0) + w
  list(x=x[i.max], i=i.max, y.hat=y.smooth)

理解这些特定语法的一些指示将会有所帮助。

1 个答案:

答案 0 :(得分:0)

以下是该代码的翻译。如果你不知道每个函数的作用,R经常使用嵌套的函数调用,这些调用很难理解。为了解决这个问题,我将一些行分成多行,并将结果存储在新变量中。

# convert y.smooth to a zoo (time series) object
zoo_y.smooth <- zoo(y.smooth)

# divide the data into rolling windows of width 2*w+1
# get the max of each window
# align = "center" makes the indices of y.max be aligned to the center
# of the windows
y.max <- rollapply(zoo_y.smooth, 
                   width = 2*w+1, 
                   FUN = max, 
                   align="center")

R子集可以非常简洁。 c(1:w, n+1-1:w)创建一个名为toExclude的数字向量。将带有-的向量传递给子集运算符[]会选择y.smooth的所有元素,但toExclude中指定的索引除外。省略-会反过来。

# select all of the elements of y.smooth except 1 to w and n+1-1 to w
toExclude <- c(1:w, n+1-1:w)
subset_y.smooth <- y.smooth[-toExclude]

# element-wise subtraction
delta <- y.max - subset_y.smooth

# logical vector the same length of delta indicating which elements
# are less than or equal to 0
nonPositiveDelta <- delta <= 0

所以nonPositiveDelta是一个像TRUE FALSE FALSE这样的向量...每个delta元素都有一个元素,表示delta的哪些元素是非正数。

# vector containing the index of each element of delta that's <= 0
indicesOfNonPositiveDeltas <- which(nonPositiveDelta)
另一方面,

indicesOfNonPositiveDeltas是一个像1,3,4,5,8这样的向量,包含前一个向量的每个元素的索引为TRUE。

# indices plus w
i.max <- indicesOfNonPositiveDeltas + w

最后,结果存储在列表中。列表有点像数组,其中列表的每个元素本身可以是另一个列表或任何其他类型。在这种情况下,列表的每个元素都是一个向量。

# create a three element list 
# each element is named, with the name to the left of the equal sign
list(
  x=x[i.max], # the elements of x at indices specified by i.max
  i=i.max, # the indices of i.max
  y.hat=y.smooth) # the y.smooth data

如果没有看到代码的其余部分或者它应该做什么的描述,我不得不猜测一下,但希望这可以帮助你。