Ответ 1
Решение, которое быстрее, чем предлагаемое выше:
vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
Это быстрее, чем предложенное выше.
У меня есть один список числового вектора, и я хочу объединить их в один вектор. Но я не могу этого сделать. Этот список может иметь один элемент, общий для элемента списка. Конечный вектор не должен добавлять их дважды. Вот пример:
>lst
`1`
[1] 1 2
`2`
[2] 2 4 5
`3`
[3] 5 9 1
Я хочу конечный результат, как этот
>result
[1] 1 2 4 5 9 1
Я попытался сделать следующее, не беспокоясь о повторении:
>vec<-vector()
>sapply(lst, append,vec)
и
>vec<-vector()
>sapply(lst, c, vec)
Ни один из них не работал. Может кто-нибудь помочь мне в этом?
Спасибо.
Решение, которое быстрее, чем предлагаемое выше:
vec<-unlist(lst)
vec[which(c(1,diff(vec)) != 0)]
Это быстрее, чем предложенное выше.
Другой ответ, используя Reduce()
.
Создайте список векторов:
lst <- list(c(1,2),c(2,4,5),c(5,9,1))
Объедините их в один вектор
vec <- Reduce(c,lst)
vec
# [1] 1 2 2 4 5 5 9 1
Сохраняйте повторяющиеся только один раз:
unique(Reduce(c,lst))
#[1] 1 2 4 5 9
Если вы хотите сохранить повторяющийся в конце, вы можете использовать vec[which(c(1,diff(vec)) != 0)]
, как в ответе @Rachid
Вы хотите rle:
rle(unlist(lst))$values
> lst <- list(`1`=1:2, `2`=c(2,4,5), `3`=c(5,9,1))
> rle(unlist(lst))$values
## 11 21 22 31 32 33
## 1 2 4 5 9 1
будет делать это тоже красиво и выглядит более кратким:
stack(lst)$values