【发布时间】: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_A 和 SP_B 在 Event 5 中
他们的VALUE 是 0.0970,想法是检查与这 3 个 SP 标签关联的 table1 和 parent numbers:
这里 parent values 是 19 和 18,然后我只需将 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_G 和 SP_H 在 Event 4 中
他们的VALUE 是0.0026,table1 中的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_A、SP_B和SP_C都有相同的父级,但SP_C的父级为 18,其他两个有 19 个。这是怎么回事? -
@Bas 你说得对,我没有注意到,实际上我在 18 到 19 之间(这里是 18)将
VALUE添加到最低的node number,我更新了帖子以用预期的输出解释。很抱歉。
标签: r dataframe merge dplyr tidyverse