2015-07-28 3 views
2
list1 = c("X", "Y") 
list2 = c("1", "2", "3") 

То, что я хочу этоСоединить каждый элемент вектора с каждым элементом другого вектора

c("X1", "X2", "X3", "Y1", "Y2", "Y3") 

Как я могу это сделать? Может быть, пакет поступил? Я попытался paste() но смешивает элементы в качестве альтернативы ("X1„У2“,„X3“).

ответ

5

Мы могли бы использовать либо expand.grid или outer на vectors, чтобы получить все комбинации, а затем мы paste вместе.

с expand.grid, на выходе будет data.frame с двумя колоннами, мы можем использовать do.call(paste0, чтобы вставить каждую строку выходного набора данных.

v1 <- do.call(paste0,expand.grid(list1, list2)) 
v1[order(v1)] 
#[1] "X1" "X2" "X3" "Y1" "Y2" "Y3" 

Или, как упоминался выше outer другой вариант бея ch должен быть очень быстрым для этой операции. Выход будет matrix, который может быть преобразован обратно в vector либо с использованием as.vector, либо c.

c(t(outer(list1, list2, FUN=paste0))) 
#[1] "X1" "X2" "X3" "Y1" "Y2" "Y3" 

Кроме того, expand.grid должен работать с list

list1 <- as.list(list1) 
list2 <- as.list(list2) 
do.call(paste0, expand.grid(list1, list2)) 
#[1] "X1" "Y1" "X2" "Y2" "X3" "Y3" 
+0

я действительно должен мастер это 'expand.grid' вещь. Я всегда делаю 'rep' вручную ... – MichaelChirico

+0

@MichaelChirico. 'expand.grid' - полезная функция. Предположим, имеется ли у нас список многих элементов. делая только 'list1 <- list (ПИСЬМА [1: 3], ПИСЬМА [4: 5], ПИСЬМА [6: 7]); expand.grid (list1) 'получит все возможные комбинации. – akrun

+0

\ * язык в щеке * * но акрун, что, если я хочу практиковать свою арифметику, используя 'rep' !? – MichaelChirico

4
list1 = c("X", "Y") 
list2 = c("1", "2", "3") 

as.character(sapply(list1, FUN = function(x) paste0(x, list2))) 

# [1] "X1" "X2" "X3" "Y1" "Y2" "Y3" 
+4

. Вы можете сжать его с помощью' c (sapply (list1, paste0, list2)) ' – akrun

+0

Спасибо, я, как правило, забываю о возможности передать аргументы' FUN', используя '... '' 'apply '. За исключением лени, есть ли причины, почему 'c' лучше, чем' as.character' в этом случае? –

+1

'as.vector' будет вернее. Но я просто хотел закодировать гольф :-). – akrun

Смежные вопросы