Я пытаюсь создать аргументы для использования в функции 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 раньше времени (в данном конкретном примере), поэтому его необходимо определить внутри скрипта.
В вашем начальном векторе, есть некоторые элементы с 'c' в качестве конечного символа. Итак, вы хотели удалить «x» и «c», а затем «разбить» вектор на основе последнего символа. Вы можете использовать 'grep/split/substr' для получения желаемого результата. то есть 'v1 <- v [! grepl ('\\ bx \\ b | c $', v)]; split (v1, substr (v1, 2,2)) ' – akrun
@akrun Я не думаю, что OP хочет явно исключить« x »и« c ». Им нужен код, который идентифицирует «x» и «c» на основе правила, что они не используют символ терминала с любой другой строкой в векторе. –
@akrun Это довольно круто, но я не знаю, что 'c' является уникальным postfix раньше времени (я знаю, однако знаю о' x' раньше времени). Эта часть должна быть выведена в программу, поэтому я так структурировал ее. – Shawn