【问题标题】:How to use dplyr to mutate columns on conditions from two dataframes如何使用 dplyr 对来自两个数据帧的条件的列进行变异
【发布时间】:2018-02-04 21:33:15
【问题描述】:

我有两个数据框,它们基于第三个更大的数据集。我想根据第二个数据帧中的条目规范化一个数据帧中的数据 - 我最喜欢使用 dplyr,但也非常感谢其他包/解决方案:)

在我的第一个数据框中,我有不同器官的计数。

数据框器官计数

 # 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$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 框架来完成这项任务,并在一个数据框架中解决所有问题,但我不确定如何。

感谢您的回答和帮助!

【问题讨论】:

  • 在基础 R 中,ave:dat$perc &lt;- dat$count / ave(dat$count, dat$organs, FUN=sum) 其中 dat 是您的第二个 data.frame 的名称。
  • 对我也很好,只是想更多地留在 dplyr 包中,所以我接受了另一个答案:) 不过,感谢您的帮助!

标签: r dplyr tidyverse


【解决方案1】:

你可以试试:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多