2013-02-12 13 views
14

मैं मैं इस (igraph पैकेज के माध्यम से) एक निर्देशित ग्राफ के लिए एक किनारे सूचीपहले कुछ कॉलम के बाद पंक्तियों में डेटा फ्रेम के कॉलम कैसे स्थानांतरित करें?

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 

में बदलना चाहते हैं स्कूलों

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

के अनुक्रम का प्रतिनिधित्व प्रत्येक पंक्ति के साथ एक डेटा फ्रेम ।

यहाँ कैसे मैं यह कर दिया गया है:

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

"स्कूलों" शामिल जो मैं चाहता है, लेकिन यह पुनरावृत्ति है और बोझिल हो जाता है अगर मैं एक चौथे स्तंभ (जैसे, "विश्वविद्यालय") जोड़ना चाहते हैं। ऐसा करने के लिए वेक्टरकृत तरीका क्या है?

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]))) 
+9

मैं कह सकते हैं यह है कि में एक बड़ा सवाल है आप (1) 'पूछा एक question', (2)' एक छोटे से काम डेटा set' प्रदान करते हैं (3) 'वांछित आउटपुट दिखाएं' और (4) 'आप वर्तमान में क्या कर रहे हैं।' +1 –

+0

मैं अपने उपयोग में बुरी तरह अकुशल हूं, लेकिन क्या यह 'पिघला हुआ' नहीं है - 'रिकस्ट' करता है? –

+0

@ करल, मैंने भी वही सोचा, लेकिन यह मामला नहीं है, कम से कम सीधे नहीं। ध्यान दें कि रूपांतरित 'data.frame' के पहले कॉलम में पहला कॉलम और' edu' से दूसरा कॉलम है। – Arun

उत्तर

11

यहाँ एक संभव समाधान है। यह vectorized नहीं है:

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

)) 
+0

पहले दो बिल्कुल सही नहीं हैं (बहुत से संयोजन मुद्रित होते हैं)। "संपादन 2" सही और भयानक है। अंतिम के लिए –

+0

+1! – agstudy

+0

+1 शानदार! । –

6

सीधे एक लागू में ओपी के कोड का अनुवाद:

2

एक मैट्रिक्स उत्पादन, igraph कार्यों के लिए आवश्यक के साथ एक वैकल्पिक।

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

परिणाम:

 [,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" 

और एक ग्राफ में बदलने का:

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

के बंद कार्य @ टायलर की विधि:

# 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]) 

परिणाम:

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

मेरे पहले प्रयासों ने 12 पंक्तियों का उत्पादन किया जो बहुत अधिक हैं। –

+0

नोटिस मैंने एक कॉलम जोड़ा, इसलिए 8 –

+0

के बजाय 12 इसे ओह मिला :) +1 –

संबंधित मुद्दे