2015-05-14 4 views
0

Я пытаюсь создать аргументы для использования в функции reshape(). У меня есть вектор имен столбцов, некоторые из которых должны быть слиты reshape(), потому что они одни и те же буквы в конце:Удалить и отложить элементы векторов внутри списка, которые не существуют в другом векторе

> v <- c("x","da","db","ea","eb","ec","fb") 

Большинство из этих колонн состоят из комбинации pre и post символов. pre будет аргументом timevar, а post будет аргументом v.names в reshape(). Они определяются как:

> pre <- c("d","e","f") 
> post <- c("a","b","c") 

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

Мой желаемый результат - это список векторов, в которые входят только элементы v, которые имеют одинаковое письмо post. Намерение состоит в том, чтобы использовать их в качестве параметра varying в reshape():

> desired_lov 
$a 
[1] "da" "ea" 

$b 
[1] "db" "eb" "fb" 

И кроме того, я хотел бы отслеживать, какие элементы отсутствуют desired_lov, которые все еще существуют в оригинальном v векторе. Намерение состоит в том, чтобы использовать их в качестве параметра idvar в reshape():

> desired_idh 
[1] "x" "ec" 

Со всем, что дал, кто-то помог мне построить список векторов с возможными именами столбцов с этими приставками и postfixes. Каждый вектор в этом списке назван в честь одного из элементов post, и я считаю, что это важно для того, чтобы это работало с reshape(), так как он будет объединить эти столбцы в каждом векторе под общим названием:

> lov <- Map(function(x) paste0(pre,x),post) 
> lov 
$a 
[1] "da" "ea" "fa" 

$b 
[1] "db" "eb" "fb" 

$c 
[1] "dc" "ec" "fc" 

Кроме этого строит больше имен из этих комбинаций, чем фактически существует в v. Поэтому я хотел бы, чтобы отслеживать, какие имена в v не существует в lov, для которых я пытался:

> idh <- NULL 
> Map(function(x) idh <- paste(idh,lov[[x]][lov[[x]] %in% v]),1:length(lov)) 
[[1]] 
[1] " da" " ea" 

[[2]] 
[1] " db" " eb" " fb" 

[[3]] 
[1] " ec" 

> idh 
NULL 

За исключением, по-видимому, я не преуспевая в модификации idh переменную с помощью Map()

на следующем этапе (после того, как я выясняю бит сразу выше), для того, чтобы вычистить элементы lov, которые не соответствуют v, я пытался:

> Map(function(x) lov[[x]] <- lov[[x]][lov[[x]] %in% v],1:length(lov)) 
[[1]] 
[1] "da" "ea" 

[[2]] 
[1] "db" "eb" "fb" 

[[3]] 
[1] "ec" 

> lov 
$a 
[1] "da" "ea" "fa" 

$b 
[1] "db" "eb" "fb" 

$c 
[1] "dc" "ec" "fc" 

Который дает мне многообещающий вывод (мне нужно было бы удалить все векторы из этого списка с длиной < 2, так как я ищу только дублированные столбцы на основе их вторых символов), но еще раз он не смог фактически изменить lov, удалив элементы, которые я пытался удалить.

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

Редактировать: Я знаю о x раньше, поэтому я могу вручную исключить его там, где это необходимо. Но я не знаю, что c является уникальным postfix раньше времени (в данном конкретном примере), поэтому его необходимо определить внутри скрипта.

+0

В вашем начальном векторе, есть некоторые элементы с 'c' в качестве конечного символа. Итак, вы хотели удалить «x» и «c», а затем «разбить» вектор на основе последнего символа. Вы можете использовать 'grep/split/substr' для получения желаемого результата. то есть 'v1 <- v [! grepl ('\\ bx \\ b | c $', v)]; split (v1, substr (v1, 2,2)) ' – akrun

+0

@akrun Я не думаю, что OP хочет явно исключить« x »и« c ». Им нужен код, который идентифицирует «x» и «c» на основе правила, что они не используют символ терминала с любой другой строкой в ​​векторе. –

+0

@akrun Это довольно круто, но я не знаю, что 'c' является уникальным postfix раньше времени (я знаю, однако знаю о' x' раньше времени). Эта часть должна быть выведена в программу, поэтому я так структурировал ее. – Shawn

ответ

1
freq <- lapply(Map(function(x) grep(x, v), post), length) 
index <- Map(function(x) grep(x, v), names(freq)[freq>1]) 
lapply(index, function(x) v[x]) 
$a 
[1] "da" "ea" 

$b 
[1] "db" "eb" "fb" 

и

v[-unlist(index)] 
[1] "x" "ec" 

данных
v <- c("x","da","db","ea","eb","ec","fb") 
pre <- c("d","e","f") 
post <- c("a","b","c") 
Смежные вопросы