R - 从向量中划分/添加数据帧值中的所有列

时间:2016-03-12 20:02:36

标签: r dataframe

我有一个向量p_vars(p)和数据框x,y,以便

df

我想按向量NCOL(x) = NCOL(y) = ncol(df). 划分每列(所有行)(这意味着:x第一列中的所有值都是向量df中的第一列,第二列(所有值)按向量x的第二列(一个值)。

向列添加向量x的情况相同(以相同的方式)。

你能帮助我以优雅的方式做到吗?

2 个答案:

答案 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。