"Умножить" / объединить / объединить строки (chr) векторов в R - PullRequest
0 голосов
/ 15 мая 2018

Всего новичков здесь. Я терплю неудачу в самых основных задач

Два вектора класса chr и разной длины

a <- c("3","5","7","X")
b <- c("A","B","C","D","E")

Мне нужно объединить их, чтобы получить новый вектор длиной $ a \ times b = 20 $ (в данном случае) вида

> c
[1] "3A" "3B" "3C" "3D" "3E" "5A" "5B" ... 

поэтому, по сути, я пытаюсь объединить каждое строковое значение a с каждым строковым значением b для каждого элемента a и b. Я использовал разные условия поиска, чтобы Google, как это сделать, но результаты оказались не такими, как ожидалось Это связано с тем, что я не знаю, какой термин я ищу, таким образом, странное название. Боюсь, что «похожие вопросы» справа от меня (на момент написания статьи) не помогают.

Следующее - почти то, что мне нужно, но вместо data.frame мне нужен вектор с двумя столбцами x и y, слитыми в один столбец, то есть вектор 20 Obs. of 1 variable. Мне нужен клей!

> c <- merge(a,b)
> c
   x y
1  3 A
2  5 A
3  7 A
4  X A
5  3 B
6  5 B
7  7 B
8  X B
9  3 C
10 5 C
11 7 C
12 X C
13 3 D
14 5 D
15 7 D
16 X D
17 3 E
18 5 E
19 7 E
20 X E
> class(c)
[1] "data.frame"

Ответы [ 2 ]

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

Мне очень нравится ответ Фабиоба. Другая опция, которая кажется немного быстрее, использует rep и paste0:

paste0(rep(a, length(b)), rep(b, each = length(a)))

Время на моем компьютере:

> library(microbenchmark)
> microbenchmark(
    c(outer(a,b,FUN=paste,sep="")),
    paste0(rep(a, length(b)), rep(b, each = length(a)))
)
Unit: microseconds
                                                    expr   min    lq     mean median    uq    max neval
                   c(outer(a, b, FUN = paste, sep = "")) 8.021 8.342 11.33799  8.662 9.304 28.231   100
     paste0(rep(a, length(b)), rep(b, each = length(a))) 4.171 4.492  6.63817  4.813 4.973 45.554   100
0 голосов
/ 15 мая 2018

Одним из решений является реализация внешнего продукта для символов:

c(outer(a,b,FUN=paste,sep=""))

Это то, что вы хотели?

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