2017-01-18 39 views
1

佈置在數據幀中像這樣由於數據:R-循環來在數據幀創建的所有變量的非可逆比

x1<-c(1,2,3,4,5) 
x2<-c(10,9,8,7,6) 
x3<-c(9,2,8,3,7) 
x4<-c(2,5,3,4,8) 
data<-data.frame(x1, x2, x3, x4) 

我想要寫一個循環,將比使用先前變量的每個變量。輸出應該是這樣的:

r_x2_x1<-x2/x1 
r_x3_x1<-x3/x1 
r_x4_x1<-x4/x1 
r_x3_x2<-x3/x2 
r_x4_x2<-x4/x2 
r_x4_x3<-x4/x3 
ratios<-data.frame(r_x2_x1, r_x3_x1, r_x4_x1, r_x3_x2, r_x4_x2, r_x4_x3) 

我想編寫一個循環,會比上面顯示和工作無關的數據幀的變量數的順序變量。我還希望輸出列名稱包含某些過程中使用的變量的指示(即,r_x2_x1是我用來表示比率2/1的標準格式)。變量不總是x1,x2,x3;他們可以是任何數字(通常與x配對)。

我寫過簡單的「for i in ...」循環,但我不知道從哪裏開始。我認爲應該有一種方法來說「從這個變量開始,將它分成剩下的變量,寫出一個數據框」,但我不知道如何將它限制爲非互惠比率(也就是說,如果我有x2/x1。我不需要x1/x2)。限制它是很重要的,以及其中一些集合有多達18-20個變量。如果包含所有可能的比率,它將浪費大量的時間來僅通過數據集來查找我需要的比率。

我真的很感謝您的幫助!

回答

0

我們可以combn做到這一點來創建列,鴻溝的配對組合,它在一個list,然後cbindlist元素與do.call

res <- do.call(cbind, combn(data, 2, FUN= function(x) list(x[2]/x[1]))) 
names(res) <- combn(names(data), 2, FUN = function(x) paste(x[2], x[1], sep="_")) 
+0

謝謝你生活在一起。我不知道combn命令,所以這非常有幫助。我現在唯一的問題是結果數據框只包含比率的分子,並不表示使用哪個變量作爲分母。這是按照我預期的順序(即我知道比例是多少),但我需要找到一種方法,用比率的分子和分母來重新命名新變量。 –

+0

@JenniferMartin更新了帖子 – akrun

+1

太好了,非常感謝回覆。看來combn將成爲我的收費箱的一個方便的補充。再次感謝! –