如何修改列表中的列表中的某些值(在R中)

时间:2015-09-22 13:30:07

标签: r list

我有一个列表,其中包含几个具有特定结构的列表:字符,数字序列和字符:

myList <- list(list("name1", c(2000,2001,2002), "suffix1"),
               list("name2", c(2000,2001,2002), "suffix2"),
               list("name3", c(2000,2001,2002), "suffix3")
               )

我想修改列表,以便在一些较低的嵌套列表中将序列限制为某个最大值,例如2001,比如说前两个:

myListModified <- list(list("name1", c(2000,2001), "suffix1"),
                       list("name2", c(2000,2001), "suffix2"),
                       list("name3", c(2000,2001,2002), "suffix3")
                       )

我已经尝试了几种方法来首先将上部嵌套列表和下部嵌套列表中的元素进行子集化,但这并不像我想象的那么简单。也许有一些完全不同的解决方法?

3 个答案:

答案 0 :(得分:3)

  

也许有一些完全不同的方法可以解决这个问题?

这是一个建议:

library(data.table)
DT = rbindlist(rapply(myList, function(x) if (length(x)>1) list(x) else x, how="replace"))
setnames(DT,c("name","y","s"))
#     name              y       s
# 1: name1 2000,2001,2002 suffix1
# 2: name2 2000,2001,2002 suffix2
# 3: name3 2000,2001,2002 suffix3

DT[1:2, y := lapply(y, function(yy) yy[yy <= 2001] )]
#     name              y       s
# 1: name1      2000,2001 suffix1
# 2: name2      2000,2001 suffix2
# 3: name3 2000,2001,2002 suffix3

这类似于DT[i,j],其中i正在过滤行,j正在替换y列。

答案 1 :(得分:2)

我们遍历前两个list元素,检查元素是否为数字,然后使用2001:2002获取值的intersect,否则返回对象。

myList[1:2] <- lapply(myList[1:2], function(x) 
  lapply(x, function(y) if(is.numeric(y)) intersect(y, 2001:2002) else y))

答案 2 :(得分:0)

类似于akrun答案的两步程序:

inds <- lapply(myList, function(x) which(x[[2]] %in% 2002:2003)) 
myList2 <- lapply(1:length(myList), function(x) list(myList[[x]][[1]],
                                                     myList[[x]][[2]][-inds[[x]]],
                                                     myList[[x]][[3]]))
  1. 我们遍历主列表,找到不需要的索引 向量中的元素是每个嵌套列表的第二项

  2. 我们重建主列表,同时删除不需要的元素     每个嵌套列表的第二项