आर

2011-01-31 11 views
9

में दो कॉलम के कारक स्तर में शामिल होना मेरे पास उसी प्रकार के डेटा (स्ट्रिंग्स) वाले डेटा के 2 कॉलम हैं।आर

मैं कॉलम के स्तर में शामिल होना चाहता हूं। अर्थात। हमने:

col1 col2 
Bob John 
Tom Bob 
Frank Jane 
Jim Bob 
Tom Bob 
... ... (and so on) 
अब

col1 है 4 स्तरों (बॉब, टॉम फ्रैंक, जिम) और col2 3 स्तरों (जॉन, जेन, बॉब) है

लेकिन मैं दोनों स्तंभ सभी कारक स्तर है करना चाहते हैं (बॉब, टॉम, फ्रैंक, जिम, जेन, जॉन), के रूप में बाद में 'नाम' में से प्रत्येक में एक विशिष्ट आईडी के साथ बदलने के लिए, ऐसी है कि अंतिम आउटपुट होगा:

col1 col2 
1  5 
2  1 
3  6 
4  1 
2  1 

बॉब है कि -> 1 , टॉम -> 2, आदि दोनों कॉलम में।

कोई विचार :)?

संपादित करें: सभी अद्भुत उत्तरों के लिए धन्यवाद! आप के रूप में तक मुझे पता है :)

उत्तर

6

आप दोनों तरफ स्तंभों से सभी अद्वितीय नामों में शामिल करना चाहते हैं।

col1 <- factor(c("Bob", "Tom", "Frank", "Jim", "Tom")) 
col2 <- factor(c("John", "Bob", "Jane", "Bob", "Bob")) 
mynames <- unique(c(levels(col1), levels(col2))) 
fcol1 <- factor(col1, levels = mynames) 
fcol2 <- factor(col2, levels = mynames) 

संपादित करें: एक छोटे से अच्छे यदि आप इस के साथ तीसरी लाइन की जगह:

mynames <- union(levels(col1), levels(col2)) 
2

इस शपथ ली है सका काम नहीं किया, जब मैं abomination नीचे लिख रहा था सब कमाल के हैं, लेकिन अब यह करता है:

## self contained example: 
txt <- "col1 col2 
Bob John 
Tom Bob 
Frank Jane 
Jim Bob 
Tom Bob" 
dat <- read.table(textConnection(txt), header = TRUE) 

बस स्तरों का अद्वितीय सेट की गणना और

> dat3 <- dat 
> lev <- as.character(unique(unlist(sapply(dat, levels)))) 
> dat3 <- within(dat3, col1 <- factor(col1, levels = lev)) 
> dat3 <- within(dat3, col2 <- factor(col2, levels = lev)) 
> str(dat3) 
'data.frame': 5 obs. of 2 variables: 
$ col1: Factor w/ 6 levels "Bob","Tom","Frank",..: 1 2 3 4 2 
$ col2: Factor w/ 6 levels "Bob","Tom","Frank",..: 5 1 6 1 1 
> data.matrix(dat3) 
    col1 col2 
[1,] 1 5 
[2,] 2 1 
[3,] 3 6 
[4,] 4 1 
[5,] 2 1 

: एक कारक के लिए प्रत्येक colX मजबूर [मूल:! दिखाने के लिए कैसे मूर्खता से जटिल और समझ से परे एक यह एक वास्तव में कड़ी मेहनत की कोशिश करता है आर कोड लिख सकते हैं] सुनिश्चित नहीं हैं कि यह विशेष रूप से eleg है चींटी (और यह नहीं है), लेकिन ...

हम पहले डेटा असूचीबद्ध:

tmp <- unlist(dat) 

तो गणना अद्वितीय स्तरों

lev <- as.character(unique(tmp)) 

और फिर पुनर्गठन tmp (ऊपर से) मूल डेटा के समान आयामों में वापस, डेटा.फ्रेम (तारों को संरक्षित) में परिवर्तित करें, इस डेटा फ्रेम पर लापरवाही से ऊपर, गणना की गई lev के साथ एक कारक बनाना, और अंत में डेटा फ्रेम पर समन्वयित करें।

dat2 <- data.frame(lapply(data.frame(matrix(tmp, ncol = ncol(dat)), 
            stringsAsFactors = FALSE), 
          FUN = factor, levels = lev)) 

देता है कौन सा:

> dat2 
    X1 X2 
1 Bob John 
2 Tom Bob 
3 Frank Jane 
4 Jim Bob 
5 Tom Bob 
> sapply(dat2, levels) 
    X1  X2  
[1,] "Bob" "Bob" 
[2,] "Tom" "Tom" 
[3,] "Frank" "Frank" 
[4,] "Jim" "Jim" 
[5,] "John" "John" 
[6,] "Jane" "Jane" 
> data.matrix(dat2) 
    X1 X2 
[1,] 1 5 
[2,] 2 1 
[3,] 3 6 
[4,] 4 1 
[5,] 2 1 
11
x <- structure(list(col1 = structure(c(1L, 4L, 2L, 3L, 4L), .Label = c("Bob", "Frank", "Jim", "Tom"), class = "factor"), col2 = structure(c(3L, 1L, 2L, 1L, 1L), .Label = c("Bob", "Jane", "John"), class = "factor")), .Names = c("col1", "col2"), class = "data.frame", row.names = c(NA, -5L)) 

कारक नामों में से एक सरल संघ बनाओ:

both <- union(levels(x$col1), levels(x$col2)) 

और दो कारकों relevel:

x$col1 <- factor(x$col1, levels=both) 
x$col2 <- factor(x$col2, levels=both) 

संपादन के बाद: उदाहरण जोड़ा कारकों से संख्यात्मक मान बनाने के लिए

आप बस संख्यात्मक मान, जैसे करने के लिए कारक के स्तर परिवर्तित कर:

as.numeric(x$col1) 

या एक और अधिक सरल, अच्छे समाधान एक कदम में नीचे @Gavin सिम्पसन संकेत के आधार पर:

data.matrix(x) 
+1

स्वच्छ, साफ और तेजी से। महान एक। IMGO उत्तर से बेहतर है कि @ गैविन ने पोस्ट किया है, हालांकि मैं 'data.frame (लापरवाही (... 'समाधान, आलसी आलसी से बाहर करना चाहूंगा। – aL3xa

+1

+1 आपने मुझे एक समझदार उत्तर में हराया। क्या आप अपना' as.numeric बदल सकते हैं (x $ col1) 'केवल' data.matrix (x) 'के लिए? यदि ऐसा है, तो मैं अपने अनावश्यक उत्तर को हटा दूंगा। –

+1

@ aL3xa - अरे, कोई उचित नहीं, मुझे टाइप किए गए वर्णों की संख्या के लिए अंक प्राप्त करना चाहिए !?; -) –