2017-08-27 77 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