如何在数据框架中迭代因子水平并添加来自列表的值的列?

huangapple go评论103阅读模式
英文:

How can I add a column with values from a list, iterating in a data frame over factor levels?

问题

I can help you translate the code-related parts into Chinese. Here it is:

给定数据框架 df

  1. df <- data.frame(1,
  2. 1:12,
  3. groups = factor(rep(LETTERS[1:4], each = 3)))
  4. df

以及列表 list_group

  1. list_group <- list(
  2. A = c("Jack","John","Joe"),
  3. B = c("Ed","Edd","Eddy"),
  4. C = c("Gianni","Franco","Ugo"),
  5. D = c("Bob","Rob","Frank"))
  6. list_group

我想要得到以下结果:

如何在数据框架中迭代因子水平并添加来自列表的值的列?

因此,添加列 person,其中包含与 df$groups 水平对应的名称。这需要将行多次复制到因子水平,但要与 list_group 中相应的名称相乘(即 df$groups 水平 "A" = "Jack","John","Joe"; df$groups 水平 "B" = "Ed","Edd","Eddy"; 等等)。

请注意,我只提供了代码的翻译部分,没有包含其他内容。

英文:

I am struggling in performing and iterating the following operation in the R environment.

Given a data frame df:

  1. df &lt;- data.frame(1,
  2. 1:12,
  3. groups = factor(rep(LETTERS[1:4], each = 3)))
  4. df

and the list list_group:

  1. list_group &lt;- list(
  2. A = c(&quot;Jack&quot;,&quot;John&quot;,&quot;Joe&quot;),
  3. B = c(&quot;Ed&quot;,&quot;Edd&quot;,&quot;Eddy&quot;),
  4. C = c(&quot;Gianni&quot;,&quot;Franco&quot;,&quot;Ugo&quot;),
  5. D = c(&quot;Bob&quot;,&quot;Rob&quot;,&quot;Frank&quot;))
  6. list_group

I would like to get the following result:

如何在数据框架中迭代因子水平并添加来自列表的值的列?

Thus, add the column person with the names in correspondence of the df$groups level. This requires to multiple the rows over the factor levels, but specifically with the corresponding names in the list_group (i.e., df$groups level "A" = "Jack","John","Joe"; df$groups level "B" = "Ed","Edd","Eddy"; etc.)

I went through the function of the Tidyverse, in particular dplyr,tidyr and purrr, but I did not find specific functions for my problem.

Also, I tried to dig into the theory behind Iteration in R, mainly following the guide 21 Iteration, but I did not succeed in that.

答案1

得分: 2

你可以使用 stack + merge

  1. merge(df, stack(list_group), by.x = "groups", by.y = "ind")

或者使用 dplyr 的等效方法:

  1. library(dplyr)
  2. full_join(df, stack(list_group), by = c("groups" = "ind"), relationship = "many-to-many")

输出:

  1. # groups X1 X1.12 values
  2. # 1 A 1 1 Jack
  3. # 2 A 1 1 John
  4. # 3 A 1 1 Joe
  5. # 4 A 1 2 Jack
  6. # 5 A 1 2 John
  7. # 6 A 1 2 Joe
  8. # 7 A 1 3 Jack
  9. # 8 A 1 3 John
  10. # 9 A 1 3 Joe
  11. # 10 B 1 4 Ed
  12. # 11 B 1 4 Edd
  13. # 12 B 1 4 Eddy
  14. # 13 B 1 5 Ed
  15. # 14 B 1 5 Edd
  16. # 15 B 1 5 Eddy
  17. # 16 B 1 6 Ed
  18. # 17 B 1 6 Edd
  19. # 18 B 1 6 Eddy
  20. # 19 C 1 7 Gianni
  21. # 20 C 1 7 Franco
  22. # 21 C 1 7 Ugo
  23. # 22 C 1 8 Gianni
  24. # 23 C 1 8 Franco
  25. # 24 C 1 8 Ugo
  26. # 25 C 1 9 Gianni
  27. # 26 C 1 9 Franco
  28. # 27 C 1 9 Ugo
  29. # 28 D 1 10 Bob
  30. # 29 D 1 10 Rob
  31. # 30 D 1 10 Frank
  32. # 31 D 1 11 Bob
  33. # 32 D 1 11 Rob
  34. # 33 D 1 11 Frank
  35. # 34 D 1 12 Bob
  36. # 35 D 1 12 Rob
  37. # 36 D 1 12 Frank
英文:

You can use stack + merge:

  1. merge(df, stack(list_group), by.x = &quot;groups&quot;, by.y = &quot;ind&quot;)

Or the dplyr equivalent:

  1. library(dplyr)
  2. full_join(df, stack(list_group), by = c(&quot;groups&quot; = &quot;ind&quot;), relationship = &quot;many-to-many&quot;)

output

  1. # groups X1 X1.12 values
  2. # 1 A 1 1 Jack
  3. # 2 A 1 1 John
  4. # 3 A 1 1 Joe
  5. # 4 A 1 2 Jack
  6. # 5 A 1 2 John
  7. # 6 A 1 2 Joe
  8. # 7 A 1 3 Jack
  9. # 8 A 1 3 John
  10. # 9 A 1 3 Joe
  11. # 10 B 1 4 Ed
  12. # 11 B 1 4 Edd
  13. # 12 B 1 4 Eddy
  14. # 13 B 1 5 Ed
  15. # 14 B 1 5 Edd
  16. # 15 B 1 5 Eddy
  17. # 16 B 1 6 Ed
  18. # 17 B 1 6 Edd
  19. # 18 B 1 6 Eddy
  20. # 19 C 1 7 Gianni
  21. # 20 C 1 7 Franco
  22. # 21 C 1 7 Ugo
  23. # 22 C 1 8 Gianni
  24. # 23 C 1 8 Franco
  25. # 24 C 1 8 Ugo
  26. # 25 C 1 9 Gianni
  27. # 26 C 1 9 Franco
  28. # 27 C 1 9 Ugo
  29. # 28 D 1 10 Bob
  30. # 29 D 1 10 Rob
  31. # 30 D 1 10 Frank
  32. # 31 D 1 11 Bob
  33. # 32 D 1 11 Rob
  34. # 33 D 1 11 Frank
  35. # 34 D 1 12 Bob
  36. # 35 D 1 12 Rob
  37. # 36 D 1 12 Frank

答案2

得分: 0

你可以使用基础的stack()函数,然后使用整洁的full_join(multiple = "all")函数:

  1. df %>% full_join(
  2. y = list_group %>% stack(),
  3. by = join_by(groups == ind),
  4. multiple = "all"
  5. )

结果:

  1. X1 X1.12 groups values
  2. 1 1 1 A Jack
  3. 2 1 1 A John
  4. 3 1 1 A Joe
  5. 4 1 2 A Jack
  6. 5 1 2 A John
  7. 6 1 2 A Joe
  8. 7 1 3 A Jack
  9. 8 1 3 A John
  10. 9 1 3 A Joe
  11. 10 1 4 B Ed
  12. 11 1 4 B Edd
  13. 12 1 4 B Eddy
  14. 13 1 5 B Ed
  15. 14 1 5 B Edd
  16. 15 1 5 B Eddy
  17. 16 1 6 B Ed
  18. 17 1 6 B Edd
  19. 18 1 6 B Eddy
  20. 19 1 7 C Gianni
  21. 20 1 7 C Franco
  22. 21 1 7 C Ugo
  23. 22 1 8 C Gianni
  24. 23 1 8 C Franco
  25. 24 1 8 C Ugo
  26. 25 1 9 C Gianni
  27. 26 1 9 C Franco
  28. 27 1 9 C Ugo
  29. 28 1 10 D Bob
  30. 29 1 10 D Rob
  31. 30 1 10 D Frank
  32. 31 1 11 D Bob
  33. 32 1 11 D Rob
  34. 33 1 11 D Frank
  35. 34 1 12 D Bob
  36. 35 1 12 D Rob
  37. 36 1 12 D Frank
英文:

You can use base stack() and then a tidy full_join(multiple = &quot;all&quot;):

  1. df %&gt;% full_join(
  2. y = list_group %&gt;% stack(),
  3. by = join_by(groups == ind),
  4. multiple = &quot;all&quot;
  5. )

Result:

  1. X1 X1.12 groups values
  2. 1 1 1 A Jack
  3. 2 1 1 A John
  4. 3 1 1 A Joe
  5. 4 1 2 A Jack
  6. 5 1 2 A John
  7. 6 1 2 A Joe
  8. 7 1 3 A Jack
  9. 8 1 3 A John
  10. 9 1 3 A Joe
  11. 10 1 4 B Ed
  12. 11 1 4 B Edd
  13. 12 1 4 B Eddy
  14. 13 1 5 B Ed
  15. 14 1 5 B Edd
  16. 15 1 5 B Eddy
  17. 16 1 6 B Ed
  18. 17 1 6 B Edd
  19. 18 1 6 B Eddy
  20. 19 1 7 C Gianni
  21. 20 1 7 C Franco
  22. 21 1 7 C Ugo
  23. 22 1 8 C Gianni
  24. 23 1 8 C Franco
  25. 24 1 8 C Ugo
  26. 25 1 9 C Gianni
  27. 26 1 9 C Franco
  28. 27 1 9 C Ugo
  29. 28 1 10 D Bob
  30. 29 1 10 D Rob
  31. 30 1 10 D Frank
  32. 31 1 11 D Bob
  33. 32 1 11 D Rob
  34. 33 1 11 D Frank
  35. 34 1 12 D Bob
  36. 35 1 12 D Rob
  37. 36 1 12 D Frank

huangapple
  • 本文由 发表于 2023年6月8日 15:51:07
  • 转载请务必保留本文链接:https://go.coder-hub.com/76429705.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定