2015-02-27 3 views
-1

В настоящее время я борюсь с моими данными. Рассмотрим следующий набор данных:R добавить значения в строки других строк

 a <- c("city1", "city2", "city3", "city4") 
     b <- c(1,3,5,9) 
     c <- c(4,1,3,10) 
     data <- data.frame(cbind(a,b,c)) 

> data 
     a b c 
1 city1 1 4 
2 city2 3 1 
3 city3 5 3 
4 city4 9 10 

Что я хотел бы получить это данные о том, что Б и значения каждого города подобраны и прикреплены в конце набора данных (тиражирование каждый город так часто, как городов в наборе данных:?.

 a b c a1  b1 c1 
1 city1 1 4 city2 3 1 
1 city1 1 4 city3 5 3 
1 city1 1 4 city4 9 10 
2 city2 3 1 city1 1 4 
2 city2 3 1 city3 5 3 
2 city2 3 1 city4 9 10 

и т.д ....

, как я могу это сделать

+0

Нет Я сожалею, что не было, как код больше (или как выход R). Он должен просто продолжаться для всех 4 городов ..., т. Е. Для всех городов коды b и c любого другого города были бы замечательными! – user43458

ответ

2

Вы хотите перекрестное соединение Вы можете использовать merge с by = NULL:

merge(data, data, by = NULL) 
    a.x b.x c.x a.y b.y c.y 
1 city1 1 4 city1 1 4 
2 city2 3 1 city1 1 4 
3 city3 5 3 city1 1 4 
4 city4 9 10 city1 1 4 
5 city1 1 4 city2 3 1 
6 city2 3 1 city2 3 1 
7 city3 5 3 city2 3 1 
8 city4 9 10 city2 3 1 
9 city1 1 4 city3 5 3 
10 city2 3 1 city3 5 3 
11 city3 5 3 city3 5 3 
12 city4 9 10 city3 5 3 
13 city1 1 4 city4 9 10 
14 city2 3 1 city4 9 10 
15 city3 5 3 city4 9 10 
16 city4 9 10 city4 9 10 

Или вы можете использовать sqldf пакет:

library(sqldf) 
sqldf("select * from data as a cross join data as b") 
     a b c  a b c 
1 city1 1 4 city1 1 4 
2 city1 1 4 city2 3 1 
3 city1 1 4 city3 5 3 
4 city1 1 4 city4 9 10 
5 city2 3 1 city1 1 4 
6 city2 3 1 city2 3 1 
7 city2 3 1 city3 5 3 
8 city2 3 1 city4 9 10 
9 city3 5 3 city1 1 4 
10 city3 5 3 city2 3 1 
11 city3 5 3 city3 5 3 
12 city3 5 3 city4 9 10 
13 city4 9 10 city1 1 4 
14 city4 9 10 city2 3 1 
15 city4 9 10 city3 5 3 
16 city4 9 10 city4 9 10 

В обоих случаях вы получаете полный крест присоединиться. После этого вы можете подмножить data.frame, чтобы получить именно то, что вы хотите. Например:

data2 <- merge(data, data, by = NULL) 
subset(data2, a.x!= a.y) 
    a.x b.x c.x a.y b.y c.y 
2 city2 3 1 city1 1 4 
3 city3 5 3 city1 1 4 
4 city4 9 10 city1 1 4 
5 city1 1 4 city2 3 1 
7 city3 5 3 city2 3 1 
8 city4 9 10 city2 3 1 
9 city1 1 4 city3 5 3 
10 city2 3 1 city3 5 3 
12 city4 9 10 city3 5 3 
13 city1 1 4 city4 9 10 
14 city2 3 1 city4 9 10 
15 city3 5 3 city4 9 10 
1

Вы можете сделать это просто через Подменю индексов, созданных с expand.grid:

idx <- expand.grid(1:4,1:4)[-seq(1,16,by=5),] 
cbind(data[idx[,2],],data[idx[,1],]) 
     a b c  a b c 
1 city1 1 4 city2 3 1 
1.1 city1 1 4 city3 5 3 
1.2 city1 1 4 city4 9 10 
2 city2 3 1 city1 1 4 
2.1 city2 3 1 city3 5 3 
2.2 city2 3 1 city4 9 10 
3 city3 5 3 city1 1 4 
3.1 city3 5 3 city2 3 1 
3.2 city3 5 3 city4 9 10 
4 city4 9 10 city1 1 4 
4.1 city4 9 10 city2 3 1 
4.2 city4 9 10 city3 5 3