æ¯ä¸¤åˆ—产å“(ä¸æ˜¯æ‰€æœ‰æˆå¯¹äº§å“)

时间:2018-01-17 17:37:23

标签: r

与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 

有没有办法没有循环?

2 个答案:

答案 0 :(得分: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)]

答案 1 :(得分:1)

您还å¯ä»¥ä½¿ç”¨dplyrçš„lag / lead函数。例如:

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