R与子列表中的元素相同

时间:2014-06-03 15:30:22

标签: r sublist

我有一个包含子列表的列表。一个子列表如下:

> m[[1]]
$input
$input$a
[1] 1

$input$b
[1] 2

$input$c
[1] 3


$output
$output$y
[1] "big dog"

整个清单是:

[[1]]
[[1]]$input
[[1]]$input$a
[1] 1

[[1]]$input$b
[1] 2

[[1]]$input$c
[1] 3


[[1]]$output
[[1]]$output$y
[1] "big dog"



[[2]]
[[2]]$input
[[2]]$input$a
[1] 12

[[2]]$input$b
[1] 89

[[2]]$input$c
[1] 67


[[2]]$output
[[2]]$output$y
[1] "fat cat"



[[3]]
[[3]]$input
[[3]]$input$a
[1] 7

[[3]]$input$b
[1] 4

[[3]]$input$c
[1] 97


[[3]]$output
[[3]]$output$y
[1] "fat cat"

代码是:

m<-list(
     list(
          input=list(a=1,b=2,c=3), 
          output=list(y="big dog")
     ),
     list(
          input=list(a=12,b=89,c=67),
          output=list(y="fat cat")
     ), 
     list(
          input=list(a=7,b=4,c=97), 
          output=list(y="fat cat")
     )
)

现在我想在名为'input'的每个子子列表中添加名为type的相同变量并包含值“pet”:

  m
  [[1]]
  [[1]]$input
  [[1]]$input$a
  [1] 1

  [[1]]$input$b
  [1] 2

  [[1]]$input$c
  [1] 3

  [[1]]$input$type
  [1] "pet"


  [[1]]$output
  [[1]]$output$y
  [1] "big dog"



  [[2]]
  [[2]]$input
  [[2]]$input$a
  [1] 12

  [[2]]$input$b
  [1] 89

  [[2]]$input$c
  [1] 67

  [[2]]$input$type
  [1] "pet"


  [[2]]$output
  [[2]]$output$y
  [1] "fat cat"



  [[3]]
  [[3]]$input
  [[3]]$input$a
  [1] 7

  [[3]]$input$b
  [1] 4

  [[3]]$input$c
  [1] 97

  [[3]]$input$type
  [1] "pet"


  [[3]]$output
  [[3]]$output$y
  [1] "fat cat"

我试过了:

Map(function(u) c(u$input, type="pet"))

但它不起作用,因为它过滤列表:( 你有什么想法吗?

2 个答案:

答案 0 :(得分:4)

这应该可以解决问题:

m2 <- lapply(m, modifyList, list(input=list(type="pet")))

## Check that it worked
str(m2[3])
# List of 1
#  $ :List of 2
#   ..$ input :List of 4
#   .. ..$ a   : num 7
#   .. ..$ b   : num 4
#   .. ..$ c   : num 97
#   .. ..$ type: chr "pet"
#   ..$ output:List of 1
#   .. ..$ y: chr "fat cat"

如果上面的公式看起来有些不透明,请尝试运行以下内容,这可能会帮助您在这种情况下看到 modifyList()的工作方式:

m[[1]]
list(input=list(type="pet"))
modifyList(m[[1]], list(input=list(type="pet")))

答案 1 :(得分:1)

如果我理解正确,我想你只想要

m<-lapply(m, function(x) {x$input$type<-"pet";x})

这会将$type="pet"添加到列表中的每个输入中。导致

list(
    list(
        input = list(a = 1, b = 2, c = 3, type = "pet"),
        output = list(y = "big dog")
    ),
    list(
        input = list(a = 12, b = 89, c = 67, type = "pet"),
        output = list(y = "fat cat")
    ),
    list(
        input = list(a = 7, b = 4, c = 97, type = "pet"),
        output = list(y = "fat cat")
    )
)