Сопоставить векторы в последовательности - PullRequest
0 голосов
/ 02 мая 2018

У меня есть 2 вектора.

x=c("a", "b", "c", "d", "a", "b", "c")
y=structure(c(1, 2, 3, 4, 5, 6, 7, 8), .Names = c("a", "e", "b", 
"c", "d", "a", "b", "c"))

Я бы хотел последовательно сопоставить a с a, b с b, чтобы x[2] соответствовало y[3], а не y[7]; и x[5] соответствует y[6], а не y[1], и так далее, и тому подобное.

lapply(x, function(z) grep(z, names(y), fixed=T))

дает:

[[1]]
[1] 1 6

[[2]]
[1] 3 7

[[3]]
[1] 4 8

[[4]]
[1] 5

[[5]]
[1] 1 6

[[6]]
[1] 3 7

[[7]]
[1] 4 8

, который соответствует всем экземплярам. Как мне получить эту последовательность:

1 3 4 5 6 7 8

Так что элементы в x могут быть сопоставлены с соответствующими значениями в y соответственно?

Ответы [ 6 ]

0 голосов
/ 02 мая 2018

Другой вариант с использованием Reduce

Reduce(function(v, k) y[-seq_len(v)][k],
    x=x[-1L],
    init=y[x[1L]], 
    accumulate=TRUE)
0 голосов
/ 02 мая 2018

Аналогичное решение для Ronak, но оно не сохраняет изменений для y

yFoo<-names(y)
sapply(x,function(u){res<-match(u,yFoo);yFoo[res]<<-"foo";return(res)})

Результат

#a b c d a b c 
#1 3 4 5 6 7 8 
0 голосов
/ 02 мая 2018

Вы на самом деле ищете pmatch

pmatch(x,names(y))
[1] 1 3 4 5 6 7 8
0 голосов
/ 02 мая 2018

Другая возможность:

l <- lapply(x, grep, x = names(y), fixed = TRUE)

i <- as.integer(ave(x, x, FUN = seq_along))

mapply(`[`, l, i)

, что дает:

[1] 1 3 4 5 6 7 8
0 голосов
/ 02 мая 2018

Ну, я сделал это с помощью цикла for

#Initialise the vector with length same as x.
answer <- numeric(length(x))
for (i in seq_along(x)) {
  #match the ith element of x with that of names in y.
  answer[i] <- match(x[i], names(y))
  #Replace the name of the matched element to empty string so next time you 
  #encounter it you get the next index.
  names(y)[i] <- ""
}

answer
#[1] 1 3 4 5 6 7 8
0 голосов
/ 02 мая 2018

Вы можете изменить атрибуты имен в соответствии с количеством раз, когда каждый элемент появился, а затем подмножество y:

x2 <- paste0(x, ave(x, x, FUN=seq_along))
#[1] "a1" "b1" "c1" "d1" "a2" "b2" "c2"
names(y) <- paste0(names(y), ave(names(y), names(y), FUN=seq_along))
y[x2]
#a1 b1 c1 d1 a2 b2 c2 
# 1  3  4  5  6  7  8 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...