如何从列表中选择元素作为名称范围以构建新列表?

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

How to select elements from a list as a range of names to build a new list?

问题

我有一个名为 spec_list 的列表。我想通过保留其中来自 AE:SUPPCM 的元素来获取一个新的列表。如何做到这一点?

我可以使用以下代码来实现:lst2 <- spec_list[c('AE', 'SUPPAE', 'CM', 'SUPPCM')],但我可以使用 AE:SUPPCM 来代替一个个列出名称吗?

  1. str(spec_list, 1)
  2. # 一个包含9个元素的列表
  3. # $ README : chr "foobar"
  4. # $ SIGN_OFF : logi TRUE
  5. # $ REVISION_HISTORY: logi NA
  6. # $ Study : num 12345
  7. # $ Datasets :List of 2
  8. # $ AE : chr "yes"
  9. # $ SUPPAE : int [1:10] 1 2 3 4 5 6 7 8 9 10
  10. # $ CM : num 1.23e+08
  11. # $ SUPPCM : int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...
英文:

I have a list of spec_list. I would like to get a new list by keeping elements from AE:SUPPCM. How can I do that?

I can do lst2 &lt;- spec_list[c(&#39;AE&#39;, &#39;SUPPAE&#39;, &#39;CM&#39;,&#39; SUPPCM&#39;)], but can I do this using AE:SUPPCM instead of listing the names one by one?

  1. str(spec_list, 1)
  2. # List of 9
  3. # $ README : chr &quot;foobar&quot;
  4. # $ SIGN_OFF : logi TRUE
  5. # $ REVISION_HISTORY: logi NA
  6. # $ Study : num 12345
  7. # $ Datasets :List of 2
  8. # $ AE : chr &quot;yes&quot;
  9. # $ SUPPAE : int [1:10] 1 2 3 4 5 6 7 8 9 10
  10. # $ CM : num 1.23e+08
  11. # $ SUPPCM : int [1:3, 1:4] 1 2 3 4 5 6 7 8 9 10 ...

答案1

得分: 2

以下是代码的中文翻译:

  1. 这是一个可以帮助你实现这个功能的小函数 -
  2. select_by_names <- function(data, x, y) {
  3. nm <- names(data)
  4. data[match(x, nm) : match(y, nm)]
  5. }

我创建了自己的示例来展示这个函数的工作方式。

  1. tmp <- head(mtcars, 2)
  2. spec_list <- list(README = tmp, `SIGN-OFF` = tmp, `REVISION HISTORY` = tmp,
  3. AE = tmp, SUPPAE = tmp, CM = tmp, SUPPCM = tmp)
  4. select_by_names(spec_list, 'AE', 'SUPPCM')
  5. #$AE
  6. # mpg cyl disp hp drat wt qsec vs am gear carb
  7. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  8. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  9. #$SUPPAE
  10. # mpg cyl disp hp drat wt qsec vs am gear carb
  11. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  12. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  13. #$CM
  14. # mpg cyl disp hp drat wt qsec vs am gear carb
  15. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  16. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  17. #$SUPPCM
  18. # mpg cyl disp hp drat wt qsec vs am gear carb
  19. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  20. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4

还有另一个示例 -

  1. select_by_names(spec_list, 'SIGN-OFF', 'CM')
  2. #$`SIGN-OFF`
  3. # mpg cyl disp hp drat wt qsec vs am gear carb
  4. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  5. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  6. #$`REVISION HISTORY`
  7. # mpg cyl disp hp drat wt qsec vs am gear carb
  8. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  9. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  10. #$AE
  11. # mpg cyl disp hp drat wt qsec vs am gear carb
  12. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  13. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  14. #$SUPPAE
  15. # mpg cyl disp hp drat wt qsec vs am gear carb
  16. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  17. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  18. #$CM
  19. # mpg cyl disp hp drat wt qsec vs am gear carb
  20. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  21. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4

希望这对你有帮助!

英文:

Here's a small function that can help you do that -

  1. select_by_names &lt;- function(data, x, y) {
  2. nm &lt;- names(data)
  3. data[match(x, nm) : match(y, nm)]
  4. }

I have created my own example to show how this function works.

  1. tmp &lt;- head(mtcars, 2)
  2. spec_list &lt;- list(README = tmp, `SIGN-OFF` = tmp, `REVISION HISTORY` = tmp,
  3. AE = tmp, SUPPAE = tmp, CM = tmp, SUPPCM = tmp)
  4. select_by_names(spec_list, &#39;AE&#39;, &#39;SUPPCM&#39;)
  5. #$AE
  6. # mpg cyl disp hp drat wt qsec vs am gear carb
  7. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  8. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  9. #$SUPPAE
  10. # mpg cyl disp hp drat wt qsec vs am gear carb
  11. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  12. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  13. #$CM
  14. # mpg cyl disp hp drat wt qsec vs am gear carb
  15. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  16. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  17. #$SUPPCM
  18. # mpg cyl disp hp drat wt qsec vs am gear carb
  19. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  20. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4

and another one -

  1. select_by_names(spec_list, &#39;SIGN-OFF&#39;, &#39;CM&#39;)
  2. #$`SIGN-OFF`
  3. # mpg cyl disp hp drat wt qsec vs am gear carb
  4. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  5. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  6. #$`REVISION HISTORY`
  7. # mpg cyl disp hp drat wt qsec vs am gear carb
  8. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  9. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  10. #$AE
  11. # mpg cyl disp hp drat wt qsec vs am gear carb
  12. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  13. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  14. #$SUPPAE
  15. # mpg cyl disp hp drat wt qsec vs am gear carb
  16. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  17. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
  18. #$CM
  19. # mpg cyl disp hp drat wt qsec vs am gear carb
  20. #Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
  21. #Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4

答案2

得分: 2

以下是翻译的部分:

这在你的列表是数据框架(data.frame)时很容易。

  1. subset(head(mtcars), select=qsec:carb)
  2. # qsec vs am gear carb
  3. # Mazda RX4 16.46 0 1 4 4
  4. # Mazda RX4 Wag 17.02 0 1 4 4
  5. # Datsun 710 18.61 1 1 4 1
  6. # Hornet 4 Drive 19.44 1 0 3 1
  7. # Hornet Sportabout 17.02 0 0 3 2
  8. # Valiant 20.22 1 0 3 1

它调用了subset.data.frame,我们可以稍微修改以使其适用于列表。

  1. select <- function(x, select, ...) {
  2. if (missing(select)) {
  3. vars <- rep_len(TRUE, length(x))
  4. } else {
  5. nl <- as.list(seq_along(x))
  6. names(nl) <- names(x)
  7. vars <- eval(substitute(select), nl, parent.frame())
  8. }
  9. x[vars]
  10. }

用法

  1. select(x=spec_list, select=AE:SUPPCM)
  2. ## 或者简写
  3. select(spec_list, AE:SUPPCM)
  4. # $AE
  5. # [1] "yes"
  6. #
  7. # $SUPPAE
  8. # [1] 1 2 3 4 5 6 7 8 9 10
  9. #
  10. # $CM
  11. # [1] 123248756
  12. #
  13. # $SUPPCM
  14. # [,1] [,2] [,3] [,4]
  15. # [1,] 1 4 7 10
  16. # [2,] 2 5 8 11
  17. # [3,] 3 6 9 12

也适用于数字,

  1. select(spec_list, 6:9)

当然也适用于“data.frame”:

  1. select(mtcars, qsec:carb)

数据:

  1. spec_list <- list(README='foobar', SIGN_OFF=TRUE, REVISION_HISTORY=NA,
  2. Study=12345, Datasets=list(iris, mtcars), AE='yes',
  3. SUPPAE=1:10, CM=123248756, SUPPCM=matrix(1:12, 3, 4))
英文:

This is easy if your list was a data.frame.

  1. subset(head(mtcars), select=qsec:carb)
  2. # qsec vs am gear carb
  3. # Mazda RX4 16.46 0 1 4 4
  4. # Mazda RX4 Wag 17.02 0 1 4 4
  5. # Datsun 710 18.61 1 1 4 1
  6. # Hornet 4 Drive 19.44 1 0 3 1
  7. # Hornet Sportabout 17.02 0 0 3 2
  8. # Valiant 20.22 1 0 3 1

It dispatches to subset.data.frame, which we can slightly change to make it work for lists.

  1. select &lt;- \(x, select, ...) {
  2. if (missing(select)) {
  3. vars &lt;- rep_len(TRUE, length(x))
  4. } else {
  5. nl &lt;- as.list(seq_along(x))
  6. names(nl) &lt;- names(x)
  7. vars &lt;- eval(substitute(select), nl, parent.frame())
  8. }
  9. x[vars]
  10. }

Usage

  1. select(x=spec_list, select=AE:SUPPCM)
  2. ## or shortly
  3. select(spec_list, AE:SUPPCM)
  4. # $AE
  5. # [1] &quot;yes&quot;
  6. #
  7. # $SUPPAE
  8. # [1] 1 2 3 4 5 6 7 8 9 10
  9. #
  10. # $CM
  11. # [1] 123248756
  12. #
  13. # $SUPPCM
  14. # [,1] [,2] [,3] [,4]
  15. # [1,] 1 4 7 10
  16. # [2,] 2 5 8 11
  17. # [3,] 3 6 9 12

Also works with numbers,

  1. select(spec_list, 6:9)

and of course with &quot;data.frame&quot;s.

  1. select(mtcars, qsec:carb)

Data:

  1. spec_list &lt;- list(README=&#39;foobar&#39;, SIGN_OFF=TRUE, REVISION_HISTORY=NA,
  2. Study=12345, Datasets=list(iris, mtcars), AE=&#39;yes&#39;,
  3. SUPPAE=1:10, CM=123248756, SUPPCM=matrix(1:12, 3, 4))

答案3

得分: 1

": "如果您愿意使用索引而不是数据帧名称,lst2会起作用。

英文:

':' Dos work if you are ok with using the index and not the df-names

  1. lst2 &lt;- spec_list[6:9]

huangapple
  • 本文由 发表于 2023年3月4日 08:29:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/75632908.html
匿名

发表评论

匿名网友

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

确定