从矢量化函数返回的顺序
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:3
和 y+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
我正在将数据帧的两列发送到矢量化函数。
对于数据框的每一行,该函数将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:3
和 y+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