【问题标题】:continually multiply many columns to form a new variable不断地将许多列相乘以形成一个新变量
【发布时间】:2018-02-22 09:58:12
【问题描述】:

我最近想在R中不断地把很多列相乘,形成一个新的变量。

我发现R中有一个prod函数,它可以提供许多向量或矩阵中所有元素的乘积。

但是,我不想得到所有元素的乘积。相反,我想得到每一行的乘积。

我可以用下面的循环代码来做到这一点:

t <-
 data.frame(x1=round(round(runif(10),1)+1),
            x2=round(round(runif(10),1)+1))
for(i in 1:nrow(t)) {    t$y[i] <- prod(t[i,]) }

但是,我想知道是否有更有效的方法或更简单的功能,因为我可以像prod(t$1:t$2) 一样使用并得到我想要的结果。

【问题讨论】:

  • 你可以试试library(matrixStats); rowProds(as.matrix(t))

标签: r function loops


【解决方案1】:

一个方便的函数是rowProds from matrixStats,但这需要matrix

library(matrixStats)
rowProds(as.matrix(t1))
#[1] 2 1 4 4 2 4 1 2 4 1

如果我们需要base R 选项,它适用于data.frame,那么使用

Reduce(`*`, t1)
#[1] 2 1 4 4 2 4 1 2 4 1

数据

set.seed(24)
t1 <- data.frame(x1=round(round(runif(10),1)+1),x2=round(round(runif(10),1)+1))  

【讨论】:

    【解决方案2】:

    @akrun 答案的 base 变体是

    x <- matrix(1:20, ncol = 4)
    
         [,1] [,2] [,3] [,4]
    [1,]    1    6   11   16
    [2,]    2    7   12   17
    [3,]    3    8   13   18
    [4,]    4    9   14   19
    [5,]    5   10   15   20
    
    apply(x, 1, prod)
    [1]  1056  2856  5616  9576 15000
    

    matrixStats::rowProd() 相比,这也适用于data.frame

    x <- as.data.frame(matrix(1:20, ncol = 4))
    x$new <- apply(x, 1, prod)
    
    > x
      V1 V2 V3 V4   new
    1  1  6 11 16  1056
    2  2  7 12 17  2856
    3  3  8 13 18  5616
    4  4  9 14 19  9576
    5  5 10 15 20 15000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-03
      • 2010-11-26
      • 2019-03-27
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多