如何使用 dplyr 根据两个数据帧的条件改变列
How to use dplyr to mutate columns on conditions from two dataframes
我有两个数据框,它们基于第三个更大的数据集。我想根据第二个数据框中的条目对一个数据框中的数据进行归一化——我最喜欢使用 dplyr,但其他 packages/solutions 也非常受欢迎 :)
在我的第一个数据框中,我有不同器官的计数。
数据帧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$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 框架来完成这项任务,并在一个数据框中解决所有问题,但我不确定如何。
感谢您的回答和帮助!
您可以尝试类似的方法:
df %>%
group_by(organs) %>%
mutate(tot = sum(count)) %>%
ungroup() %>%
mutate(pct = count/tot)
无需使用第一个数据帧,因为第二个数据帧中已有该信息。仅 select 您要用于最终输出的列。
数据:
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
我有两个数据框,它们基于第三个更大的数据集。我想根据第二个数据框中的条目对一个数据框中的数据进行归一化——我最喜欢使用 dplyr,但其他 packages/solutions 也非常受欢迎 :)
在我的第一个数据框中,我有不同器官的计数。
数据帧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$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 框架来完成这项任务,并在一个数据框中解决所有问题,但我不确定如何。
感谢您的回答和帮助!
您可以尝试类似的方法:
df %>%
group_by(organs) %>%
mutate(tot = sum(count)) %>%
ungroup() %>%
mutate(pct = count/tot)
无需使用第一个数据帧,因为第二个数据帧中已有该信息。仅 select 您要用于最终输出的列。
数据:
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