2017-08-27 73 views
1

我有兩個數據幀,它們基於第三個更大的數據集。我想根據第二個數據框中的條目來標準化一個數據幀中的數據 - 我最喜歡使用dplyr,但其他包/解決方案也非常感謝:)如何使用dplyr突變兩個數據幀的條件

在我的第一個數據框中,我有不同器官的數量。

數據幀organ_count

# A tibble: 5 x 2 
         organs count 
         <fctr> <int> 
1      Organ_A 23 
2      Organ_B 29 
3      Organ_C 24 
4      Organ_D 145 
5      Organ_E 97 

在我的第二個數據幀,我也有同樣的器官的數量,但在在哪個國家,他們出現在大型數據集我作爲源分裂。

數據幀organ_state_count

# A tibble: 15 x 3 
       organs hmm_state count 
      <fctr>  <chr> <int> 
1  Organ_A   E1  12 
2  Organ_A   E2  2 
3  Organ_A   E3  9 
4  Organ_B   E1  13 
5  Organ_B   E2  10 
6  Organ_B   E3  6 
7  Organ_C   E1  7 
8  Organ_C   E2  7 
9  Organ_C   E3  10 
10  Organ_D   E1  72 
11  Organ_D   E2  23 
12  Organ_D   E3  50 
13  Organ_E   E1  90 
14  Organ_E   E2  2 
15  Organ_E   E3  5 

我想現在要做的是:

我想條目總數爲這個器官分化organ_state_count $計數(在organ_state給出),導致這個機構對特定國家的百分比。

我已經嘗試過這樣的事情:

organ_state_count %>% 
    rowwise() %>% 
    do(organ_total = filter(organ_count,organs == .$organs)) %>% 
    mutate(organ_norm=.$count/organ_total) 

但它拋出這個錯誤消息:

Error in mutate_impl(.data, dots) : 
Evaluation error: arguments imply differing number of rows: 1, 0. 
In addition: Warning messages: 
1: Unknown or uninitialised column: 'count'. 
2: In Ops.factor(left, right) : ‘/’ not meaningful for factors 

我必須承認,我是相當新的R和整個dplyr/tidyverse事同樣,所以我有點不知所措。

我也認爲在這個任務中使用organ_state_count框架有一些可能性,並且只在一個數據框中解決所有問題,但我不知道如何。

感謝您的回答和幫助!

+1

在基R,與'ave':'DAT $ PERC < - DAT $計數/ AVE(DAT $計數,DAT $器官, FUN = sum)'其中dat是第二個data.frame的名稱。 – lmo

+0

也對我很好,只是想留在dplyr包更多,所以我接受了其他答案:)儘管如此,感謝您的幫助! – jakoberr

回答

2

你可以嘗試這樣的:

df %>% 
    group_by(organs) %>% 
    mutate(tot = sum(count)) %>% 
    ungroup() %>% 
    mutate(pct = count/tot) 

沒有必要使用第一個數據幀,因爲你在第二個數據幀已經是信息。只需選擇您想要用於最終輸出的列。

數據:

df <- read.table(text = "id organs hmm_state count 
1 Organ_A E1 12 
2 Organ_A E2 2 
3 Organ_A E3 9 
4 Organ_B E1 13 
5 Organ_B E2 10 
6 Organ_B E3 6 
7 Organ_C E1 7 
8 Organ_C E2 7 
9 Organ_C E3 10 
10 Organ_D E1 72 
11 Organ_D E2 23 
12 Organ_D E3 50 
13 Organ_E E1 90 
14 Organ_E E2 2 
15 Organ_E E3 5", sep =" ", header = TRUE) 

輸出:

 id organs hmm_state count tot  pct 
    <int> <fctr> <fctr> <int> <int>  <dbl> 
1  1 Organ_A  E1 12 23 0.52173913 
2  2 Organ_A  E2  2 23 0.08695652 
3  3 Organ_A  E3  9 23 0.39130435 
4  4 Organ_B  E1 13 29 0.44827586 
5  5 Organ_B  E2 10 29 0.34482759 
6  6 Organ_B  E3  6 29 0.20689655 
7  7 Organ_C  E1  7 24 0.29166667 
8  8 Organ_C  E2  7 24 0.29166667 
9  9 Organ_C  E3 10 24 0.41666667 
10 10 Organ_D  E1 72 145 0.49655172 
11 11 Organ_D  E2 23 145 0.15862069 
12 12 Organ_D  E3 50 145 0.34482759 
13 13 Organ_E  E1 90 97 0.92783505 
14 14 Organ_E  E2  2 97 0.02061856 
15 15 Organ_E  E3  5 97 0.05154639 
+0

工作就像一個魅力,非常感謝你! – jakoberr