r - 如何在不使用循环的情况下将自己的矩阵的奇数行相乘以获得向量

标签 r

我需要编写一个函数,根据给定的矩阵 BBB1 计算两个向量:A - 等于矩阵 BBB1 奇数行的元素积,B - 等于偶数行的乘积。同时,您需要在不使用循环的情况下执行此操作。我知道如何提取偶数/奇数行,但我不知道如何在没有循环的情况下将第 n 行相乘。

func <- function(BBB1) {
  A <- 1 
  B <- 1
  for (i in (1:dim(BBB1)[1])) {
    if (i %% 2 == 0) B <- B*BBB1[i, ]
    else A <- A*BBB1[i, ]
  }
  m <- list(A, B)
  return(m)
}

所以我写下了这个函数,但只是通过一个循环。

示例:

"V1" "V2" "V3" "V4" "V5"
"1" 1 5 9 13 17
"2" 2 6 10 14 18
"3" 3 7 11 15 19
"4" 4 8 12 16 20

期望的结果:

Vector AA= 3 35 99 195 323 
Vector BB= 8 48 120 224 360

最佳答案

使用回收的逻辑索引进行子集化,然后在 base R 中使用 prod 可能会更容易

apply(BBB1[c(TRUE, FALSE),], 2, prod)
 V1  V2  V3  V4  V5 
  3  35  99 195 323 
apply(BBB1[c(FALSE, TRUE),], 2, prod)
 V1  V2  V3  V4  V5 
  8  48 120 224 360 

或者使用matrixStats中的colProds

library(matrixStats)
> colProds(as.matrix(BBB1[c(TRUE, FALSE),]))
[1]   3  35  99 195 323
> colProds(as.matrix(BBB1[c(FALSE, TRUE),]))
[1]   8  48 120 224 360

数据

BBB1 <- structure(list(V1 = 1:4, V2 = 5:8, V3 = 9:12, V4 = 13:16,
 V5 = 17:20), class = "data.frame",
 row.names = c("1", 
"2", "3", "4"))

关于r - 如何在不使用循环的情况下将自己的矩阵的奇数行相乘以获得向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72408292/

相关文章:

R - 在应用函数中访问对象自己的名称

r - 将列从一个数据帧合并到另一个数据帧(left_join 不起作用)- rstudio

r - Kable:如何根据行中其他值的比例对值使用条件格式

r - R中的牛顿法

R tidytext 如果相关二元组的一部分则删除单词,如果不是则保留

r - 在 Shiny 中创建有条件可见的侧边栏

r - Rcpp程序中的最小和最大

R:ggplot 和 plotly 轴边距不会改变

excel - 使用 R 将 Excel 电子表格保存为 .csv?

R:通过循环对列的值求和