2014-09-06 4 views
0

Учитывая фрейм данных, я хотел бы изменить его и вернуть еще один фрейм данных из 2 столбцов. 2 столбца этого кадра данных состоят из любых 2 элементов строки в исходном фрейме данных. Таким образом, у нас будет C(ncol,2) * nrow количество строк во втором кадре данных. Вот пример. Учитывая фрейм данных z, я хотел бы вернуть x. Как я могу это сделать?Реорганизация столбцов фрейма данных

> z = data.frame(A = c(1,2,3), B = c(4,5,6), C = c(7,8,9)) 
> z 
    A B C 
1 1 4 7 
2 2 5 8 
3 3 6 9 
> x 
    A B 
1 1 4 
2 1 7 
3 4 7 
4 2 5 
5 2 8 
6 5 8 
7 3 6 
8 3 9 
9 6 9 

ответ

1

Или, вы можете попробовать:

matrix(apply(z, 1, combn,2), ncol=2, byrow=TRUE) 
#  [,1] [,2] 
#[1,] 1 4 
#[2,] 1 7 
#[3,] 4 7 
#[4,] 2 5 
#[5,] 2 8 
#[6,] 5 8 
#[7,] 3 6 
#[8,] 3 9 
#[9,] 6 9 

Чтобы получить data.frame в качестве выходного сигнала

setNames(as.data.frame(matrix(apply(z, 1, combn,2), ncol=2, byrow=TRUE)), LETTERS[1:2]) 
0

Нечто подобное будет работать

newz <- setNames(do.call(rbind.data.frame, lapply(split(z, 1:nrow(z)), function(x) 
    t(combn(x,2)))), 
c("A","B")) 
newz 

#  A B 
# 1.1 1 4 
# 1.2 1 7 
# 1.3 4 7 
# 2.1 2 5 
# 2.2 2 8 
# 2.3 5 8 
# 3.1 3 6 
# 3.2 3 9 
# 3.3 6 9 

Это порождает новые строки, используя все комбинации столбцов, если с помощью combn(). Если вы ненавидите rownames по умолчанию, вы можете избавиться от них с

rownames(newz)<-NULL 
newz 
# A B 
# 1 1 4 
# 2 1 7 
# 3 4 7 
# 4 2 5 
# 5 2 8 
# 6 5 8 
# 7 3 6 
# 8 3 9 
# 9 6 9 
Смежные вопросы