【问题标题】:Merge information between two df in R合并R中两个df之间的信息
【发布时间】:2020-09-25 14:50:40
【问题描述】:

我需要帮助才能在此表中添加新列:

 > table1
       parent node        blgth label
    1      19    1 0.1357120409  SP_A
    2      19    2 0.0794631914  SP_B
    3      18    3 0.0861335837  SP_C
    4      17    4 0.6693699494  SP_D
    5      21    5 0.9480669221  SP_E
    6      21    6 1.1270609760  SP_F
    7      20    7 0.4409983357  SP_G
    8      20    8 0.4412279821  SP_H
    9      16    9 1.1449969710  SP_I
    10     22   10 1.0935878043  SP_J
    11     23   11 0.0000025842  SP_K
    12     23   12 0.0053554342  SP_L
    13     13   13           NA  Root
    14     13   14 0.4741914879  71.5
    15     14   15 0.0606263444  87.6
    16     15   16 0.1427482127  40.4
    17     16   17 0.0836374533   100
    18     17   18 0.4057476840  99.8
    19     18   19 0.0979910062  87.7
    20     15   20 0.4931972115   100
    21     14   21 0.0957999921  73.1
    22     13   22 0.7289752119   100
    23     22   23 0.6091491479   100

思路是解析另一个表:

> table2
   label  VALUE Event
1   SP_E     NA     1
2   SP_G 0.0026     4
3   SP_H 0.0026     4
4   SP_I     NA     3
5   SP_F     NA     2
6   SP_A 0.0970     5
7   SP_B 0.0970     5
8   SP_C 0.0970     5
9   SP_E     NA     1
10  SP_G 0.0026     4
11  SP_H 0.0026     4
12  SP_F     NA     2
13  SP_A 0.0970     5
14  SP_B 0.0970     5
15  SP_C 0.0970     5
16  SP_E     NA     1
17  SP_G 0.0026     4
18  SP_H 0.0026     4
19  SP_F     NA     2
20  SP_A 0.0970     5
21  SP_B 0.0970     5
22  SP_C 0.0970     5
23  SP_E     NA     1
24  SP_G 0.0026     4
25  SP_H 0.0026     4
26  SP_F     NA     2
27  SP_A 0.0970     5
28  SP_B 0.0970     5
29  SP_C 0.0970     5

这个想法是首先在table2 groupby Event 中查看哪些label 在同一个Event 中:

例如:

SP_ASP_BEvent 5

他们的VALUE0.0970,想法是检查与这 3 个 SP 标签关联的 table1parent numbers: 这里 parent values1918,然后我只需将 VALUE (0.0970) 添加到 最低节点号(此处为 18)在table1 中插入一个新列VALUE

parent  node blgth      label  VALUE
19  1   0.1357120409    SP_A 
19  2   0.0794631914    SP_B
18  3   0.0861335837    SP_C
17  4   0.6693699494    SP_D
21  5   0.9480669221    SP_E
21  6   1.1270609760    SP_F
20  7   0.4409983357    SP_G
20  8   0.4412279821    SP_H
16  9   1.1449969710    SP_I
22  10  1.0935878043    SP_J
23  11  0.0000025842    SP_K
23  12  0.0053554342    SP_L
13  13  NA  Root
13  14  0.4741914879    71.5
14  15  0.0606263444    87.6
15  16  0.1427482127    40.4
16  17  0.0836374533    100
17  18  0.4057476840    99.8  0.0970
18  19  0.0979910062    87.7
15  20  0.4931972115    100
14  21  0.0957999921    73.1
13  22  0.7289752119    100
22  23  0.6091491479    100

然后我对事件 4 做同样的事情:

SP_GSP_HEvent 4

他们的VALUE0.0026table1 中的parent 值是20,然后我添加VALUE 0.0026 > 将对应的node number 20 插入到VALUE 中的新列table1

parent  node blgth      label  VALUE
19  1   0.1357120409    SP_A 
19  2   0.0794631914    SP_B
18  3   0.0861335837    SP_C
17  4   0.6693699494    SP_D
21  5   0.9480669221    SP_E
21  6   1.1270609760    SP_F
20  7   0.4409983357    SP_G
20  8   0.4412279821    SP_H
16  9   1.1449969710    SP_I
22  10  1.0935878043    SP_J
23  11  0.0000025842    SP_K
23  12  0.0053554342    SP_L
13  13  NA  Root
13  14  0.4741914879    71.5
14  15  0.0606263444    87.6
15  16  0.1427482127    40.4
16  17  0.0836374533    100
17  18  0.4057476840    99.8  0.0970
18  19  0.0979910062    87.7  
15  20  0.4931972115    100   0.0026
14  21  0.0957999921    73.1
13  22  0.7289752119    100
22  23  0.6091491479    100

如果我为另一个人做这个过程(他们在事件中很孤独),我会简单地添加NA values(因为他们的VALUE在table2中是NA

这是预期的最终结果:

parent  node blgth      label  Mean_dNdS
19  1   0.1357120409    SP_A 
19  2   0.0794631914    SP_B
18  3   0.0861335837    SP_C
17  4   0.6693699494    SP_D
21  5   0.9480669221    SP_E
21  6   1.1270609760    SP_F
20  7   0.4409983357    SP_G
20  8   0.4412279821    SP_H
16  9   1.1449969710    SP_I
22  10  1.0935878043    SP_J
23  11  0.0000025842    SP_K
23  12  0.0053554342    SP_L
13  13  NA  Root
13  14  0.4741914879    71.5  NA
14  15  0.0606263444    87.6  NA
15  16  0.1427482127    40.4  NA
16  17  0.0836374533    100   NA
17  18  0.4057476840    99.8  0.0970
18  19  0.0979910062    87.7  
15  20  0.4931972115    100   0.0026
14  21  0.0957999921    73.1  NA
13  22  0.7289752119    100   NA
22  23  0.6091491479    100   NA 

有人会有想法吗?我猜 dplyr 或 tydiverse 方法可能有用,因为它包含 groupby 循环?

数据:

table1

structure(list(parent = c(19L, 19L, 18L, 17L, 21L, 21L, 20L, 
20L, 16L, 22L, 23L, 23L, 13L, 13L, 14L, 15L, 16L, 17L, 18L, 15L, 
14L, 13L, 22L), node = 1:23, blgth = c(0.1357120409, 0.0794631914, 
0.0861335837, 0.6693699494, 0.9480669221, 1.127060976, 0.4409983357, 
0.4412279821, 1.144996971, 1.0935878043, 2.5842e-06, 0.0053554342, 
NA, 0.4741914879, 0.0606263444, 0.1427482127, 0.0836374533, 0.405747684, 
0.0979910062, 0.4931972115, 0.0957999921, 0.7289752119, 0.6091491479
), label = structure(c(9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 
17L, 18L, 19L, 20L, 8L, 3L, 5L, 2L, 1L, 7L, 6L, 1L, 4L, 1L, 1L
), .Label = c("100", "40.4", "71.5", "73.1", "87.6", "87.7", 
"99.8", "Root", "SP_A", "SP_B", "SP_C", "SP_D", "SP_E", "SP_F", 
"SP_G", "SP_H", "SP_I", "SP_J", "SP_K", "SP_L"), class = "factor")), class = "data.frame", row.names = c(NA, 
-23L))

table2

structure(list(label = structure(c(4L, 6L, 7L, 8L, 5L, 1L, 2L, 
3L, 4L, 6L, 7L, 5L, 1L, 2L, 3L, 4L, 6L, 7L, 5L, 1L, 2L, 3L, 4L, 
6L, 7L, 5L, 1L, 2L, 3L), .Label = c("SP_A", "SP_B", "SP_C", "SP_E", 
"SP_F", "SP_G", "SP_H", "SP_I"), class = "factor"), VALUE = c(NA, 
0.0026, 0.0026, NA, NA, 0.097, 0.097, 0.097, NA, 0.0026, 0.0026, 
NA, 0.097, 0.097, 0.097, NA, 0.0026, 0.0026, NA, 0.097, 0.097, 
0.097, NA, 0.0026, 0.0026, NA, 0.097, 0.097, 0.097), Event = c(1L, 
4L, 4L, 3L, 2L, 5L, 5L, 5L, 1L, 4L, 4L, 2L, 5L, 5L, 5L, 1L, 4L, 
4L, 2L, 5L, 5L, 5L, 1L, 4L, 4L, 2L, 5L, 5L, 5L)), class = "data.frame", row.names = c(NA, 
-29L))

【问题讨论】:

  • 在您的示例中,您声称 SP_ASP_BSP_C 都有相同的父级,但 SP_C 的父级为 18,其他两个有 19 个。这是怎么回事?
  • @Bas 你说得对,我没有注意到,实际上我在 18 到 19 之间(这里是 18)将VALUE 添加到最低的node number,我更新了帖子以用预期的输出解释。很抱歉。

标签: r dataframe merge dplyr tidyverse


【解决方案1】:

我想这就是你想要的。
我们通过label 将table1 连接到table2,以便能够使用parent 列。然后,我们按Event 分组并取平均值VALUE(因为它总是相同的,我们也可以取minfirst),并取最小值parent

library(tidyverse)

table3 <- table2 %>% 
  left_join(table1, by = "label") %>% 
  group_by(Event) %>% 
  summarize(Mean_dNdS = mean(VALUE),
            parent = min(parent)) %>% 
  select(parent, Mean_dNdS)

这给了

 parent Mean_dNdS
  <int>     <dbl>
1    21   NA     
2    21   NA     
3    16   NA     
4    20    0.0026
5    18    0.097 

然后我们可以简单地将这个表加入table1,得到你想要的结果。

table1 %>% 
  left_join(table3, by = c("node" = "parent"))

给予

   parent node        blgth label Mean_dNdS
1      19    1 0.1357120409  SP_A        NA
2      19    2 0.0794631914  SP_B        NA
3      18    3 0.0861335837  SP_C        NA
4      17    4 0.6693699494  SP_D        NA
5      21    5 0.9480669221  SP_E        NA
6      21    6 1.1270609760  SP_F        NA
7      20    7 0.4409983357  SP_G        NA
8      20    8 0.4412279821  SP_H        NA
9      16    9 1.1449969710  SP_I        NA
10     22   10 1.0935878043  SP_J        NA
11     23   11 0.0000025842  SP_K        NA
12     23   12 0.0053554342  SP_L        NA
13     13   13           NA  Root        NA
14     13   14 0.4741914879  71.5        NA
15     14   15 0.0606263444  87.6        NA
16     15   16 0.1427482127  40.4        NA
17     16   17 0.0836374533   100        NA
18     17   18 0.4057476840  99.8    0.0970
19     18   19 0.0979910062  87.7        NA
20     15   20 0.4931972115   100    0.0026
21     14   21 0.0957999921  73.1        NA
22     14   21 0.0957999921  73.1        NA
23     13   22 0.7289752119   100        NA
24     22   23 0.6091491479   100        NA

【讨论】:

  • 我这样做很奇怪:ggtree(as.treedata(table4))got from the 2.1.1 chapter here:yulab-smu.github.io/treedata-book/chapter2.html 我从 R 收到一个致命错误。 .@巴斯
  • 嗨@chippycentra,我认为你最好为此提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
相关资源
最近更新 更多