2016-09-15 2 views
0

Я хотел бы создать вектор, используя имена и цифры.loop in loop, создающий вектор в R

У меня есть 2 группы: А и В. у меня есть 2 рода: мужской и женский у меня есть 2 животные: собака и кошка

Вместо того чтобы писать вектор containting имя каждой группы:

vector= c("Amaledog","Afemaledog","Amalecat","Afemalecat","Bmaledog","Bfemaledog","Bmalecat","Bfemalecat") 

Я хотел бы использовать цикл в цикле:

group=c("A","B") 
gender=c("female","male") 
animal=c("dog","cat") 

for (a in group){ 
for (b in gender){ 
    for (c in animal){ 
    vector=paste0(a,b,c) 
    } 
} 
} 

Но я только получить: "Bmalecat"

Знаете ли вы, почему? Как я могу исправить эту проблему?

+1

Пожалуйста, отметьте один из ответов ниже правильным, если работал для вас. – prateek1592

ответ

1

Вы каждый раз переписываете vector, вот в чем проблема. То, что вы, вероятно, хотите сделать это

vect <- character(length(group) * length(gender) * length(animal)) 

i <- 1 
for (a in group){ 
    for (b in gender){ 
    for (c in animal){ 
     vect[i] <- paste0(a,b,c) 
     i <- i + 1 
    } 
    } 
} 

Это важно заранее выделить вектор для того, чтобы избежать ада много (неэффективного) перераспределения. Вы должны предпочтительно использовать векторизованное решение.

+0

Я чувствую себя сломанной записью: «Не выращивайте объект в цикле. По крайней мере, предварительно назначьте конечный размер «. 'vect <- character (длина (группа) * длина (пол) * длина (животное))' – Roland

+0

@ Роланд, это именно то, что я сказал себе –

+0

Спасибо, Эли Корвиго и Роланд за ваши ответы. Он будет работать на меня. Хорошего дня. – Mily

4

Вы могли бы просто использовать expand.grid

expand.grid(group=c("A","B"),gender=c("female","male"),animal=c("dog","cat")) 

Выход:

group gender animal 
1  A female dog 
2  B female dog 
3  A male dog 
4  B male dog 
5  A female cat 
6  B female cat 
7  A male cat 
8  B male cat 

Edit:

do.call(paste0, expand.grid(group=c("A","B"),gender=c("female","male"),animal=c("dog","cat"))) 

Это должно сделать это, как отмечалось в комментариях.

+1

'do.call (paste0, expand.grid (группа, пол, животное))' – Roland

+0

благодарю вас за ответ. Я хочу иметь один вектор, содержащий имена, а не данные :) – Mily

+0

Отредактировав ответ, используя совет Роланда – prateek1592

0

Вот вариант использования data.table с крестом присоединиться (CJ)

library(data.table) 
CJ(group, gender, animal)[, do.call(paste0, .SD)] 
#[1] "Afemalecat" "Afemaledog" "Amalecat" "Amaledog" "Bfemalecat" 
#[6] "Bfemaledog" "Bmalecat" "Bmaledog"