我有一个向量p_vars(p)
和数据框x,y
,以便
df
我想按向量NCOL(x) = NCOL(y) = ncol(df).
划分每列(所有行)(这意味着:x
第一列中的所有值都是向量df
中的第一列,第二列(所有值)按向量x
的第二列(一个值)。
向列添加向量x
的情况相同(以相同的方式)。
你能帮助我以优雅的方式做到吗?
答案 0 :(得分:3)
我们可以复制'x'然后除'df'
df/x[col(df)]
如果我们需要添加'y'
(df/x[col(df)]) + y[col(df)]
df <- as.data.frame(matrix(1:25, 5, 5))
x <- 1:5
y <- 6:10
答案 1 :(得分:1)
另一种方法是转置,利用短矢量操作数的自动循环执行操作,然后再次转置以返回到原始转置。这个解决方案导致矩阵而不是data.frame,这可能是不可取的,尽管可以说因为你在输入的每个单元上执行数值计算,所以它更适合于将其存储为数字矩阵。
窃取akrun的数据作为例子:
df <- as.data.frame(matrix(1:25,5L,5L));
x <- 1:5;
y <- 6:10;
t(t(df)/x + y);
## V1 V2 V3 V4 V5
## [1,] 7 10.0 11.66667 13.00 14.2
## [2,] 8 10.5 12.00000 13.25 14.4
## [3,] 9 11.0 12.33333 13.50 14.6
## [4,] 10 11.5 12.66667 13.75 14.8
## [5,] 11 12.0 13.00000 14.00 15.0
此解决方案似乎具有性能优势:
library(microbenchmark);
akrun <- function() df/x[col(df)] + y[col(df)];
bgoldst <- function() t(t(df)/x + y);
identical(as.data.frame(bgoldst()),akrun());
## [1] TRUE
identical(bgoldst(),as.matrix(akrun()));
## [1] TRUE
identical(bgoldst(),akrun());
## [1] FALSE
microbenchmark(akrun(),bgoldst(),times=1000L);
## Unit: microseconds
## expr min lq mean median uq max neval
## akrun() 812.542 867.9235 930.60749 894.6515 922.235 2395.288 1000
## bgoldst() 50.036 58.5890 68.82336 67.1420 71.846 1417.672 1000
我为我的偷窃行为给了akrun +1。