【问题标题】:How to merge two lists based on object indices - keeping attributes?如何根据对象索引合并两个列表 - 保留属性?
【发布时间】:2020-05-16 11:02:39
【问题描述】:

我想合并两个保存每个对象索引的列表:

mylist<-list(1,NULL,2)
otherlist<-list(NULL,3,NULL,4,5,6)

# Desired

list(1,3,2,4,5,6)

# my try:

suppressWarnings(mapply(c, mylist, otherlist) )

答案应该是通用的

编辑:为了避免类似问题的扩散。我决定在这里也请求保留属性的可能性(最好是基数)。

mylist<-list(1,NULL,2)
attr(mylist[[1]],"at")<-"a"
attr(mylist[[3]],"at")<-"c"

otherlist<-list(NULL,3,NULL,4,5,6)

attr(otherlist[[2]],"at")<-"b"
attr(otherlist[[4]],"at")<-"d"
attr(otherlist[[5]],"at")<-"e"
attr(otherlist[[6]],"at")<-"f"

【问题讨论】:

  • 描述有点混乱。您是否正在寻找价值匹配
  • 不,只是定位。 (索引)
  • 我还有一个例子,mylist &lt;- list(1, NULL, 3); otherlist &lt;- list(4, 2, NULL, 4, 5, NULL) 这里的结果是什么
  • 您能否展示新示例的预期效果

标签: r attributes


【解决方案1】:

这是一个选项,我们使用lengths 创建一个逻辑索引(当有NULL 时将返回0)并使用mylist unlisted 分配元素

otherlist[lengths(otherlist) == 0] <- unlist(mylist)
otherlist
#[[1]]
#[1] 1

#[[2]]
#[1] 2

#[[3]]
#[1] 3

#[[4]]
#[1] 4

#[[5]]
#[1] 5

#[[6]]
#[1] 6

如果我们需要使用Map,请确保对应元素的lengths相同

otherlist[seq_along(mylist)] <- Map(c, otherlist[seq_along(mylist)], mylist)

更新

对于更新的示例

i1 <- sapply(otherlist, is.null)
i2 <- !sapply(mylist, is.null)
otherlist[i1] <- mylist[i2]

otherlist
#[[1]]
#[1] 1
#attr(,"at")
#[1] "a"

#[[2]]
#[1] 3
#attr(,"at")
#[1] "b"

#[[3]]
#[1] 2
#attr(,"at")
#[1] "c"

#[[4]]
#[1] 4
#attr(,"at")
#[1] "d"

#[[5]]
#[1] 5
#attr(,"at")
#[1] "e"

#[[6]]
#[1] 6
#attr(,"at")
#[1] "f"

【讨论】:

  • @Ferroao 这个例子的预期是什么。在这里,每个列表的长度都不同。不清楚如何替换 NULL 值
  • @Ferroao otherlist[seq_along(mylist)] &lt;- Map(c, otherlist[seq_along(mylist)], mylist) 应该适用于新示例。但是,我认为您必须解决一个一般性问题,并且从示例和描述中我没有得到确切的问题。 Map 假定任一对应元素为 NULL。如果它们都不为 NULL,则连接起来为该元素创建一个长度为 2 的元素
  • 您的意思是确保相应元素的长度相同?。
  • 我觉得这个效果比预期的要好,正因为如此,不管长度,它都会根据索引合并,谢谢。
【解决方案2】:
foo <- function(l1, l2) {
  out <- vector(mode = "list", length = max(length(l1), length(l2)))
  out[seq_along(l1)] <- l1
  out[!lengths(out)] <- l2[!lengths(out)]
  out
}

foo(mylist, otherlist2)

# [[1]]
# [1] 1
# attr(,"at")
# [1] "a"
# 
# [[2]]
# [1] 3
# attr(,"at")
# [1] "b"
# 
# [[3]]
# [1] 2
# attr(,"at")
# [1] "c"
# 
# [[4]]
# [1] 5
# attr(,"at")
# [1] "e"
# 
# [[5]]
# [1] 6
# attr(,"at")
# [1] "f"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2015-10-28
    • 1970-01-01
    相关资源
    最近更新 更多