从列表中选择和分离元素

时间:2011-08-17 17:07:31

标签: r

我在列表中有一个名单列表,例如:

site <- list("site2-site22" ,"site2-site45", "site4-site2", 
             "site6-site2","site9-site4", "site20-site6", 
             "site25-site272", "site32-site47","site62-site74", 
             "site272-site280")

例如,从列表中,我需要选择那些在其之前或之后具有site2的元素 -

并将它们放在一个单独的列表中,

我可以使用grep命令,如下所示:

grep("^site2-|-site2$",site,value=T)

并将它们全部保存在单独的列表中。

以类似的方式,我需要为所有其他站点选择:site2,site3,site4等,并将它们保存在每个站点的单独列表中,但是有一种方法可以使用单个命令将它们分开并保存每个站点在不同的名单?

3 个答案:

答案 0 :(得分:1)

您是否考虑过使用pastelapply函数构建匹配的字符串模式,然后在每个网站上应用grep?像这样:

site <- list("site2-site22" ,"site2-site45", "site4-site2", 
             "site6-site2","site9-site4", "site20-site6", 
             "site25-site272", "site32-site47","site62-site74", 
             "site272-site280")

l <- paste("site",c(2,4,6),sep="")

myFun <- function(x,siteList){
    pat <- paste("^",x,"-|-",x,"$",sep="")
    grep(pat,siteList,value = TRUE)
}

lapply(l,FUN = myFun, siteList = site)

返回:

[[1]] [1] "site2-site22" "site2-site45" "site4-site2"  "site6-site2" 

[[2]] [1] "site4-site2" "site9-site4"

[[3]] [1] "site6-site2"  "site20-site6"

答案 1 :(得分:0)

好吧,我不知道一个命令,但是一行可能是:

lapply(1:5, function(i) grep(paste("^site",i,"-|-site",i,"$", sep=""),site,value=T))

...然后当然修改1:5以满足您的需求。

答案 2 :(得分:0)

首先,制作所有可能网站的向量,如果您还没有。我给网站提供了自己的名字,以便以后更好地标记。

sites <- unique(unlist(strsplit(unlist(site), "-")))
names(sites) <- sites

然后,您可以使用plyr库来循环并为每个站点运行grep,使用paste构建grep字符串。

library("plyr")

llply(sites, function(s) {grep(paste("^",s,"-|-",s,"$",sep=""), site, value=TRUE)})