2013-02-12 16 views
14

Tôi có một khung dữ liệu với mỗi hàng đại diện cho một chuỗi các trườngLàm cách nào để di chuyển các cột của một khung dữ liệu thành các hàng sau một vài cột đầu tiên?

edu <- read.table(header=TRUE, text="Elem Mid High 
e1 m1 h1 
e2 m2 h2 
e1 m2 h2 
e3 m1 h1") 

Tôi muốn chuyển đổi này vào một danh sách cạnh

s1 s2 
1 e1 m1 
2 e2 m2 
3 e1 m2 
4 e3 m1 
5 m1 h1 
6 m2 h2 
7 m2 h2 
8 m1 h1 

cho một đồ thị có hướng (thông qua các gói igraph) .

Đây là cách tôi làm điều đó:

e2m <- edu[,1:2] 
m2h <- edu[,2:3] 
colnames(e2m) <- c("s1", "s2") 
colnames(m2h) <- c("s1", "s2") 
schools <- rbind(e2m,m2e) 

"trường học" chứa những gì tôi muốn, nhưng nó là lặp đi lặp lại và trở nên cồng kềnh nếu tôi muốn thêm một cột thứ tư (ví dụ "Uni"). Cách vectorized để làm điều này là gì?

+9

Tôi có thể nói rằng đây là một câu hỏi lớn trong đó bạn (1) 'hỏi một question', (2)' cung cấp một nhỏ set' dữ liệu làm việc, (3) 'hiển thị kết quả mong muốn' và (4)' những gì bạn hiện đang làm.' +1 –

+0

Tôi không có kỹ năng trong việc sử dụng nó, nhưng đây không phải là những gì 'melt' -' recast' làm gì? –

+0

@Carl, tôi cũng nghĩ như vậy, nhưng không phải như vậy, ít nhất là không đơn giản. Lưu ý rằng cột đầu tiên của 'data.frame' đã chuyển đổi có cả cột đầu tiên và cột thứ hai từ' edu'. – Arun

Trả lời

11

Đây là một giải pháp khả thi:

len <- seq_along(edu) 
a <- head(len, -1) 
b <- tail(len, -1) 

data.frame(s1=as.character(unlist(edu[, a])), s2=as.character(unlist(edu[, b]))) 
+0

Hai cái đầu tiên không hoàn toàn đúng (quá nhiều kết hợp được in). "Edit2" là chính xác và tuyệt vời. –

+0

+1 cho người cuối cùng! – agstudy

+0

+1 Brilliant! . –

6

trực tiếp dịch mã của OP thành một áp dụng. Đây không phải là véc tơ:

do.call(rbind, lapply(seq(ncol(edu)-1), FUN=function(x){ 
    r <- edu[,x:(x+1)] 
    colnames(r) <- c('s1', 's2') 
    r 
} 

)) 
2

Thay thế bằng đầu ra ma trận, được yêu cầu bởi các chức năng igraph.

t(
    matrix(
    apply(edu,1,function(x) x[c(1,rep(2:(length(x)-1),each=2),length(x))]), 
    nrow=2 
     ) 
) 

Kết quả:

 [,1] [,2] 
[1,] "e1" "m1" 
[2,] "m1" "h1" 
[3,] "e2" "m2" 
[4,] "m2" "h2" 
[5,] "e1" "m2" 
[6,] "m2" "h2" 
[7,] "e3" "m1" 
[8,] "m1" "h1" 

Và chuyển đổi sang một đồ thị:

> graph.edgelist(result) 
IGRAPH DN-- 7 8 -- 
+ attr: name (v/c) 
3

Làm việc tắt của @ Phương pháp Tyler:

# assuming a new column added 
edu$Uni <- as.factor(c("u1", "u2", "u1", "u1")) 

.

rows <- nrow(edu) 
total <- prod(dim(edu)) # ie: nrow(edu) * ncol(edu) 

X <- as.character(unlist(edu)) 
data.frame(s1=X[1:(total-rows)], s2=X[(rows+1):total]) 

Kết quả:

s1 s2 
1 e1 m1 
2 e2 m2 
3 e1 m2 
4 e3 m1 
5 m1 h1 
6 m2 h2 
7 m2 h2 
8 m1 h1 
9 h1 u1 <~~~ Added "Uni" column 
10 h2 u2 <~~~ Added "Uni" column 
11 h2 u1 <~~~ Added "Uni" column 
12 h1 u1 <~~~ Added "Uni" column 
+0

Lần thử đầu tiên của tôi tạo ra 12 hàng quá nhiều. –

+0

thông báo tôi đã thêm một cột, do đó 12 thay vì 8 –

+0

Oh đã nhận được :) +1 –

Các vấn đề liên quan