2013-02-07 17 views
7

मेरे पास एक विशाल डेटासेट है जिसमें प्रत्येक कॉलम (पंक्ति) के लिए कई मान शामिल हैं।एक कॉलम को एकाधिक कॉलम में विभाजित करना

data <- data.frame(subject = c(1:8), sex = c(1, 2, 2, 1, 2, 1, 1, 2), 
       age = c(35, 29, 31, 46, 64, 57, 49, 58), 
       v1 = c("2", "0", "3,5", "2 1", "A,4", "B,1,C", "A and B,3", "5, 6 A or C")) 

> data 
    subject sex age   v1 
1  1 1 35   2 
2  2 2 29   0 
3  3 2 31   3,5 # separated by a comma 
4  4 1 46   2 1 # separated by a blank space 
5  5 2 64   A,4 
6  6 1 57  B,1,C 
7  7 1 49 A and B,3 
8  8 2 58 5, 6 A or C 

मैं पहली बार चौथे स्तंभ में पत्र (A, B, A and B, ...) निकालना चाहते हैं (v1) सिर्फ इस तरह एकाधिक स्तंभों में चौथे स्तंभ विभाजित करते हैं, और उसके बाद: यहाँ एक सरल नमूना dataframe है :

subject sex age x1 x2 x3 x4 x5 x6 
1  1 1 35 0 1 0 0 0 0   
2  2 2 29 0 0 0 0 0 0 
3  3 2 31 0 0 1 0 1 0 
4  4 1 46 1 1 0 0 0 0 
5  5 2 64 0 0 0 1 0 0 
6  6 1 57 1 0 0 0 0 0 
7  7 1 49 0 0 1 0 0 0 
8  8 2 58 0 0 0 0 1 1 

जहां 1 विषय x2 पर ले जाता है 1, क्योंकि यह मूल डेटासेट में v1 पर 2 लेता है, 3 विषय दोनों x3 और x5 में 1 लेता है, क्योंकि यह मूल डेटासेट में v1 पर 3 और 5 लेता है, और इसी तरह।

मैं इस प्रश्न पर किसी भी मदद की सराहना करता हूं। बहुत बहुत धन्यवाद।

उत्तर

4

एक समाधान:

:

r <- sapply(strsplit(as.character(dt$v1), "[^0-9]+"), as.numeric) 
m <- as.data.frame(t(sapply(r, function(x) { 
     y <- rep(0, 6) 
     y[x[!is.na(x)]] <- 1 
     y 
    }))) 
data <- cbind(data[, c("subject", "sex", "age")], m) 

# subject sex age V1 V2 V3 V4 V5 V6 
# 1  1 1 35 0 1 0 0 0 0 
# 2  2 2 29 0 0 0 0 0 0 
# 3  3 2 31 0 0 1 0 1 0 
# 4  4 1 46 1 1 0 0 0 0 
# 5  5 2 64 0 0 0 1 0 0 
# 6  6 1 57 1 0 0 0 0 0 
# 7  7 1 49 0 0 1 0 0 0 
# 8  8 2 58 0 0 0 0 1 1 
DWin के भयानक समाधान के बाद

, m के रूप में संशोधित किया जा सकता है

m <- as.data.frame(t(sapply(r, function(x) { 
     0 + 1:6 %in% x[!is.na(x)] 
    }))) 
+0

आपको बहुत बहुत धन्यवाद। आपकी आर स्क्रिप्ट बहुत अच्छी तरह से काम करती है। – user187454

+0

आपके अपडेट के लिए धन्यवाद। मेरे पास एक अतिरिक्त सवाल है। यहां मैं केवल एक साधारण डेटासेट देता हूं जिसमें v1 अधिकतम मान "6" लेता है। मेरे वास्तविक डेटा में, चूंकि यह बहुत बड़ा है, क्या यह स्वयं को निर्दिष्ट करने के बजाय स्वचालित रूप से v1 के अधिकतम मान को निर्धारित करने का एक आसान तरीका है? धन्यवाद। – user187454

+0

बहुत बहुत धन्यवाद, आप बहुत उपयोगी हैं। – user187454

5

आप डेटा को यह परिणाम cbind कर सकते हैं [-4] और आप अपनी ज़रूरत की चीज़ों:

0+t(sapply(as.character(data$v1), function(line) 
     sapply(1:6, function(x) x %in% unlist(strsplit(line, split="\\s|\\,"))))) 
#---------------- 
      [,1] [,2] [,3] [,4] [,5] [,6] 
2    0 1 0 0 0 0 
0    0 0 0 0 0 0 
3,5   0 0 1 0 1 0 
2 1   1 1 0 0 0 0 
A,4   0 0 0 1 0 0 
B,1,C   1 0 0 0 0 0 
A and B,3  0 0 1 0 0 0 
5, 6 A or C 0 0 0 0 1 1 
+0

आपको बहुत बहुत धन्यवाद। आपका कोड बहुत अच्छा काम करता है। – user187454

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