【问题标题】:Product of every two columns (not all pairwise products)每两列的乘积(并非所有成对乘积)
【发布时间】:2018-01-18 03:52:21
【问题描述】:

这与R pairwise product相同。

考虑以下几点:

df <- structure(list(V1 = 10.3333333333333, V2 = 1.66666666666667, 
    V3 = 8.66666666666667, V4 = 2.66666666666667, V5 = 8.76666666666667, 
    V6 = 2, V7 = 6.33333333333333, V8 = 1.66666666666667, V9 = 11, 
    V10 = 2.66666666666667, V11 = 4.33333333333333, V12 = 1.66666666666667, 
    V13 = 9.83333333333333, V14 = 3.33333333333333), class = "data.frame", .Names = c("V1", 
"V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", 
"V12", "V13", "V14"), row.names = c(NA, -1L))

如果我们将其视为向量 V,我想计算一个由元素 V[i] * V[i+1] 组成的向量,其中 i = 1, 3, 5, ...., 13 .(即第一个分量是df的前两个分量的乘积,第二个分量是df的第三个和第四个分量的乘积,等等)

也就是说,以下会产生所需的输出:

> v <- numeric(7)
> df <- structure(list(V1 = 10.3333333333333, V2 = 1.66666666666667, 
+     V3 = 8.66666666666667, V4 = 2.66666666666667, V5 = 8.76666666666667, 
+     V6 = 2, V7 = 6.33333333333333, V8 = 1.66666666666667, V9 = 11, 
+     V10 = 2.66666666666667, V11 = 4.33333333333333, V12 = 1.66666666666667, 
+     V13 = 9.83333333333333, V14 = 3.33333333333333), class = "data.frame", .Names = c("V1", 
+ "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9", "V10", "V11", 
+ "V12", "V13", "V14"), row.names = c(NA, -1L))
> for (i in 1:length(v)){
+     v[i] <- df[1,2*i-1] * df[1,2*i]
+ }
> v
[1] 17.222222 23.111111 17.533333 10.555556 29.333333  7.222222 32.777778 

有没有办法做到这一点没有循环?

【问题讨论】:

  • 只需用整数序列索引偶数和奇数条目。 df[, seq(from = 1, to = ncol(df), by = 2)] * df[, seq(from = 2, to = ncol(df), by = 2)]
  • @qdread 为什么我没有想到这一点?谢谢!

标签: r


【解决方案1】:

这给了你真正想要的,给定一个只有一行的data.frame

v <- as.numeric(df[, seq(1, ncol(df), by=2)] * df[, seq(2, ncol(df), by=2)])

省略as.numeric 以将结果保留为data.frame。这将在具有更多行的data.frame 上按行工作,并且如果data.frame 具有奇数个变量,则会引发错误。

如果那行数字只是你所说的向量V,原理是一样的。

V <- unlist(df, recursive = TRUE, use.names = FALSE)
v <- V[seq(1, length(V), by=2)] * V[seq(2, length(V), by=2)]

【讨论】:

    【解决方案2】:

    您还可以使用 dplyr 的滞后/领先功能。例如:

    library(dplyr)
    (df*lag(df))[,seq(2,length(df),2)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多