2016-02-17 59 views
3

我在循環遍歷Dataframe的列,並將值除以另一個數據框中的列名索引的值?

    Label 2015-08-24 2015-08-25 
    1    AxG 179238.8 174160.3 
    2    CHaF 203544.2 199411.9 
    3    HHHH 130138.9 129182.2 
    4    fLS 146367.0 148708.0 
    5    KSU 194584.7 188508.0 
    6    MqCC 272922.7 273369.5 
    7    BEPU  0.0  0.0 
    8    SSEX 107566.4 111552.8 
    9    QQQ 248380.4 257064.2 
    10    AAA 258735.4 260415.5 

像下面有許多列和數據的數據幀我有具有行索引相同如在第一列名(在這種情況下的日期)的另一數據幀。我想在第二

     totals 
     2015-08-24  1741479 
     2015-08-25  199411.9 

我最初的想法與相應值的第一個數據幀的列的每一個值除以是像做如下(我來自一個Python化的背景下,雖然前一陣子)

 > for(i in names(df1)){ 
     + df1[[df1[,i]/df2[i,]]] 

但是,這是我收到錯誤:

錯誤.subset2(X,I,確切=精確):第1級沒有這樣的索引在 此外:警告消息:在行動。因素(權重[,我], weight_totals [i,]):'/'對因素沒有意義

任何想法?

+0

什麼錯誤?你沒有打印它 –

+0

'df1 [,1] < - df1 [,1]/df2 [1,1]' 'df1 [,2] < - df1 [,2]/df2 [2,1]' ? – bouncyball

+0

我的一般做法是融化第一個數據幀,然後合併/加入第二個數據幀。你可以讓它們正常化和轉動。列值會有問題,但是,這不能是數字,因此您需要將數據細化一點。 – zach

回答

5

我們也可以使用sweep。對於任何必須在數組上應用值向量的情況,這是一個有用的函數。我們選擇保證金2掃過列(我們可以選擇1爲行):

sweep(df[-1], 2, df2$totals, '/') 
#  2015-08-24 2015-08-25 
# [1,] 0.10292332 0.8733696 
# [2,] 0.11688008 1.0000000 
# [3,] 0.07472895 0.6478159 
# [4,] 0.08404753 0.7457328 
# [5,] 0.11173531 0.9453197 
# [6,] 0.15671892 1.3708786 
# [7,] 0.00000000 0.0000000 
# [8,] 0.06176727 0.5594089 
# [9,] 0.14262612 1.2891116 
# [10,] 0.14857222 1.3059176 
4

你可以調換你的第二個data.frame和使用用於intersect()

dft <- data.frame(t(df2), check.names = FALSE) # transpose df2 

mapply("/", df[intersect(names(df), names(dft))], 
     dft[intersect(names(df), names(dft))]) # perfrom division 
#  2015-08-24 2015-08-25 
# [1,] 0.10292332 0.8733696 
# [2,] 0.11688008 1.0000000 
# [3,] 0.07472895 0.6478159 
# [4,] 0.08404753 0.7457328 
# [5,] 0.11173531 0.9453197 
# [6,] 0.15671892 1.3708786 
# [7,] 0.00000000 0.0000000 
# [8,] 0.06176727 0.5594089 
# [9,] 0.14262612 1.2891116 
#[10,] 0.14857222 1.3059176 

數據乘以匹配列:

df <- structure(list(Label = structure(c(2L, 4L, 6L, 5L, 7L, 8L, 3L, 
10L, 9L, 1L), .Label = c("AAA", "AxG", "BEPU", "CHaF", "fLS", 
"HHHH", "KSU", "MqCC", "QQQ", "SSEX"), class = "factor"), `2015-08-24` = c(179238.8, 
203544.2, 130138.9, 146367, 194584.7, 272922.7, 0, 107566.4, 
248380.4, 258735.4), `2015-08-25` = c(174160.3, 199411.9, 129182.2, 
148708, 188508, 273369.5, 0, 111552.8, 257064.2, 260415.5)), .Names = c("Label", 
"2015-08-24", "2015-08-25"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10")) 

df2 <- structure(list(totals = c(1741479, 199411.9)), .Names = "totals", row.names = c("2015-08-24", 
"2015-08-25"), class = "data.frame") 
+0

我以爲他們試圖劃分 –

+0

thx @PierreLafortune,編輯。 – mtoto

2

Altough @PierreLafortune具有最短的解決方案,使用sweep要求的df列名的順序和的rownames df2必須相同。當使用for(並且我想也使用@mtoto的intersect方法),df的列名和df2的rownames不必爲了得到期望的結果而具有相同的順序。另一個優點是,df立即更新:

for(i in names(df)[-1]) 
    df[, i] <- df[, i]/df2$totals[match(i, row.names(df2))] 

這給:

> df 
    Label 2015-08-24 2015-08-25 
1 AxG 0.10292332 0.8733696 
2 CHaF 0.11688008 1.0000000 
3 HHHH 0.07472895 0.6478159 
4 fLS 0.08404753 0.7457328 
5 KSU 0.11173531 0.9453197 
6 MqCC 0.15671892 1.3708786 
7 BEPU 0.00000000 0.0000000 
8 SSEX 0.06176727 0.5594089 
9 QQQ 0.14262612 1.2891116 
10 AAA 0.14857222 1.3059176 
相關問題