Выбор и выделение элементов из списка - PullRequest
2 голосов
/ 17 августа 2011

У меня есть список имен в списке, например:

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 ]

1 голос
/ 17 августа 2011

Рассматривали ли вы использование функций paste и lapply для создания строкового шаблона для сопоставления и затем применения 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"
0 голосов
/ 17 августа 2011

Сначала создайте вектор из всех возможных сайтов, если у вас его еще нет. Я даю сайту собственное имя, чтобы потом его лучше помечать.

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

Затем вы можете использовать библиотеку plyr, чтобы выполнить цикл и запустить grep для каждого сайта, создав строку grep, используя paste.

library("plyr")

llply(sites, function(s) {grep(paste("^",s,"-|-",s,"$",sep=""), site, value=TRUE)})
0 голосов
/ 17 августа 2011

Ну, я не знаю ни одной команды, но одна строка могла бы быть:

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

... и затем, конечно, измените 1:5 в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...