2014-10-01 36 views
2
  A B  C  D E  F 
[1,] 187 174 183 115 101 104 
[2,] 451 166 177 842 101 133 
[3,] 727 171 187 12803 98 134 
[4,] 1532 181 196 730 98 108 
[5,] 4139 188 214 20358 105 159 
[6,] 689 185 211 1633 110 162 
[7,] 1625 184 195 2283 109 114 
[8,] 771 181 190 904 105 110 
[9,] 950 177 190 1033 106 112 
[10,] 703 180 191 463 106 110 
[11,] 2052 178 188 2585 100 105 
[12,] 1161 178 187 2874 99 110 
[13,] 214 175 184 173 98 110 
[14,] 473 184 191 971 104 111 
[15,] 756 185 193 14743 107 114 

我有一個類似於上述數據的數據集。 如何生成一個矩陣,其中所有比率都是根據下一列和前一列之間的數字計算得出的?計算列之間的成對比率,在R

 B/A  C/B  D/C  E/D  F/E 
[1,] 174/187 183/174 115/183 101/115 104/101 
[2,] 
[3,] 
[4,] 
[5,] 
[6,] 
... 
+6

希望輸出的樣子,因爲它是空白什麼這不是那麼清楚,我,但'x [, - 1]/x [, - ncol(x)]'(其中'x'是你矩陣的名稱)給你你想要的嗎?除了最後一列外,這除了第一列以外的所有列除外。 – ping 2014-10-01 19:48:44

+0

@ping因爲我所有的變量都是數值。我想獲得一個新的數據框,並在相鄰列之間計算比率。例如,在新數據框中,第1列是舊數據集中ColB/ColA的比率,第2列是ColC/ColB的比率... – Vicki1227 2014-10-01 19:58:43

+1

您是否在第一條評論中嘗試了建議?我相信這是你要求的。 – SimonG 2014-10-01 20:04:43

回答

1

從ping的建議,但調整了數據幀列子集(意味着我所做的只是取消逗號)。

new <- df[-1]/df[-length(df)] 
colnames(new) <- paste(names(df)[-1], names(df)[-length(df)], sep = "/") 
head(new) 
#   B/A  C/B  D/C   E/D  F/E 
# 1 0.93048128 1.051724 0.6284153 0.878260870 1.029703 
# 2 0.36807095 1.066265 4.7570621 0.119952494 1.316832 
# 3 0.23521320 1.093567 68.4652406 0.007654456 1.367347 
# 4 0.11814621 1.082873 3.7244898 0.134246575 1.102041 
# 5 0.04542160 1.138298 95.1308411 0.005157678 1.514286 
# 6 0.26850508 1.140541 7.7393365 0.067360686 1.472727 

如果你可能想在數據應用多個功能,你還可以做

Fun <- function(...) list(...) 
Fun(`/`)[[1]](df[-1], df[-length(df)]) 
+0

正如評論中所建議的那樣,你也可以使用這一行:'df [, - 1]/df [, - ncol(df)]' – digEmAll 2014-10-01 20:23:19

+1

@digEmAll - 是的,但他們想出了真棒col名稱算法? 'paste(名稱(df)[ - 1],名稱(df)[ - 長度(df)],sep =「/」)'等等,這是一樣的。 Haha – 2014-10-01 20:34:32

+0

如果我的數據集df中的所有這些數字變量旁邊都有時間戳列(col 1),該怎麼辦?我如何計算第2欄的比率,即B/A實際上是第3欄除以第2欄? – Vicki1227 2014-10-01 21:22:56