之前有人問過類似的問題,關于對串列的元素求和。但我的問題與其他問題略有不同。
我有一個向量串列。我正在嘗試將第一個向量的第一個元素與串列中其他向量的每個元素相加。然后我想將我的第一個向量中的第二個元素與我串列中其他向量中的每個其他單個元素相加......等等。
希望我的例子能解釋我想要做什么。例如,如果我的串列如下所示:
l <- list(
a = c(1,2,3),
b = c(10,4),
c = c(8,5)
)
明確地寫出我想要做的事情看起來像:
1 10 8
1 10 5
1 4 8
1 4 5
2 10 8
2 10 5
2 4 8
2 4 5
3 10 8
3 10 5
3 4 8
3 4 5
換句話說,采取:
l[[1]][1] l[[2]][1] l[[3]][1]
l[[1]][1] l[[2]][1] l[[3]][2]
l[[1]][1] l[[2]][2] l[[3]][1]
l[[1]][1] l[[2]][2] l[[3]][2]
l[[1]][2] l[[2]][1] l[[3]][1]... and so on for each element
因此,我最終想要的輸出如下所示:
[1] 19 16 13 10 20 17 14 11 21 18 15 12
關于我如何做到這一點的任何建議?
編輯:此外,為了使事情更復雜,我需要按照我在明確寫出所有總和時顯示的順序回傳值。所以結果必須與我想要的輸出相匹配。
uj5u.com熱心網友回復:
所以你的目標是計算a[i] b[j] c[k]
. 為了匹配您的特定訂單,我們可以
## the reason for using rev(l) instead of l is explained below
c(Reduce(function (u, v) outer(u, v, " "), rev(l)))
# [1] 19 16 13 10 20 17 14 11 21 18 15 12
l
使用和之間的區別在于rev(l)
速度i
和變化。j
k
- 如果使用
l
,速度為i > j > k
; - 如果使用
rev(l)
,速度是k > j > i
。
的魔力(或便利性outer
)在于,在我們使用 扁平化結果之前c()
,存盤是一個可解釋的 3D 陣列。
- 如果使用
l
,我們有arr[i, j, k] = a[i] b[j] c[k]
; - 如果使用
rev(l)
,我們有arr[k, j, i] = a[i] b[j] c[k]
。
thelatemail的expand.grid
解決方案也很棒。expand.grid
生成一個資料框,因此最終rowSums
必須先將資料框強制轉換為矩陣。但正如thelatemail評論的那樣,除非我們有長向量,否則 的性能損失expand.grid
不太可能引起注意。(感謝thelatemail提醒我這個功能。)
uj5u.com熱心網友回復:
另一種選擇,基于將每個值組合成l
三列,然后對每一行求和。
rowSums(expand.grid(rev(l)))
#[1] 19 16 13 10 20 17 14 11 21 18 15 12
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/497353.html
標籤:r
上一篇:如何使用可用的最后日期創建變數