从矢量化函数返回的顺序

The order returned from a vectorised function

我正在将数据帧的两列发送到矢量化函数。

对于数据框的每一行,该函数将return 3 行。所以总行数 returned 将是 nrow(dataframe) * 3。总列数 returned 将等于 2.

下面的简单函数生成了正确的数字集。但是这些数字 return 以一种特殊的顺序排列。我想有可能按照我想要的顺序获得这些数字的顺序......使用一些基本函数的组合。但是,如果可能的话,我想编写易于理解的代码。

所以我的问题是:

是否有更好的方法来编写函数(或调用函数)以产生所需的结果(在下面注释掉)?

fnVector <- function(fx, fy) {
   x1 <- fx + 1
   x2 <- fx + 2
   x3 <- fx + 3    

   y1 <- fy + 1
   y2 <- fy + 2
   y3 <- fy + 3

   vctx <- c(x1, x2, x3)
   vcty <- c(y1, y2, y3)

   #vct.pair <- c(vctx, vcty)
   vct.series <-  c(x1, y1, x2, y2, x3, y3)
   return(vct.series)

}    

vct.names <- c("a", "b")
vct.x <- c(10, 20)
vct.y <- c(100, 200)
df.data <- data.frame(name = vct.names, x = vct.x, y = vct.y)
aa <- fnVector(df.data$x, df.data$y)

# desired result [nrow(dataframe) * 3, 2] (i.e. 3 x 2 )
#11, 101 (i.e. row a)
#12, 102 (i.e. row a)
#13, 103 (i.e. row a)
#21, 201 (i.e. row b)
#22, 202 (i.e. row b)
#23, 203 (i.e. row b)

我想你想要交错向量,即 returned x 是 x1[1], x2[1], x3[1], x1[2], x2[2], x3[2], ...

所以你可以:

vctx <- c(rbind(x1, x2, x3)) # interleaves the x2
vcty <- c(rbind(y1, y2, y3)) # interleaves the x2

然后return一个矩阵,而不是一个向量:

return(cbind(vctx, vcty))

给你

fnVector <- function(fx, fy) {
   x1 <- fx + 1
   x2 <- fx + 2
   x3 <- fx + 3    

   y1 <- fy + 1
   y2 <- fy + 2
   y3 <- fy + 3

   vctx <- c(rbind(x1, x2, x3)) # interleaves the x2
   vcty <- c(rbind(y1, y2, y3)) # interleaves the x2

   return(cbind(vctx, vcty))
}
fnVector(df.data$x, df.data$y)
#      vctx vcty
# [1,]   11  101
# [2,]   12  102
# [3,]   13  103
# [4,]   21  201
# [5,]   22  202
# [6,]   23  203

您可能需要考虑同时保留 name 列。


我不知道这是否适合您的特定应用程序(我知道您为了这个问题的目的简化了您的 fnVector),但您可能想调查 plyr:

library(plyr)
ddply(df.data, .(name), summarize,
      vctx = x + 1:3,
      vcty = y + 1:3)
#   name vctx vcty
# 1    a   11  101
# 2    a   12  102
# 3    a   13  103
# 4    b   21  201
# 5    b   22  202
# 6    b   23  203

ddply(df.data, .(name),表示"for each unique value in df.data$name",summarize表示"call the summarize function",然后是两个命名参数vctx=..vcty=..。为这些列中的每一列创建输出 3 行(对于我们,x+1:3y+1:3,但对于您的应用程序,可能更复杂)。

我认为您的函数可以大大简化,而且我还认为将自定义函数与 apply 函数之一一起使用最有意义。试试这个代码:

fnVector <- function(x) {
    y <- rbind(x+1, x+2, x+3)
    return(y)
}

df.output <- data.frame(apply(df.data[, c("x", "y")], 2, function(x) fnVector(x)))

> df.output
   x   y
1 11 101
2 12 102
3 13 103
4 21 201
5 22 202
6 23 203