2010-08-09 13 views
28

मुझे आश्चर्य हुआ कि आर वैक्टर को संयोजित करते समय कारकों को एक संख्या में मजबूर करेगा। यह तब भी होता है जब स्तर समान होते हैं। उदाहरण के लिए:कारकों को कैसे संयोजित किया जाए, बिना उन्हें पूर्णांक स्तर में परिवर्तित किया जा सके?

> facs <- as.factor(c("i", "want", "to", "be", "a", "factor", "not", "an", "integer")) 
> facs 
[1] i  want to  be  a  factor not  an  integer 
Levels: a an be factor i integer not to want 
> c(facs[1 : 3], facs[4 : 5]) 
[1] 5 9 8 3 1 

क्या आर में यह करने के लिए मुहावरेदार तरीका है (मेरे मामले में इन वैक्टर बहुत बड़ा हो सकता है)? धन्यवाद।

उत्तर

27

R Mailing list से:

unlist(list(facs[1 : 3], facs[4 : 5])) 

'cbind' कारकों के लिए,

data.frame(facs[1 : 3], facs[4 : 5]) 
6

वाह, मुझे कभी एहसास नहीं हुआ कि उसने ऐसा किया था। यहाँ एक काम के आसपास है:

x <- c(facs[1 : 3], facs[4 : 5]) 
x <- factor(x, levels=1:nlevels(facs), labels=levels(facs)) 
x 
उत्पादन के साथ

:

[1] i want to be a 
Levels: a an be factor i integer not to want 

यह केवल दो वैक्टर एक ही स्तर है, तो यहां के रूप में काम करेंगे।

+0

महान धन्यवाद क्योंकि मैं इस मामले में सार्थक सबसेट मापदंड नहीं है, मैं सिर्फ सिर() और पूंछ() का उपयोग करेगा ! मैंने अभी यह पता लगाया है कि अनलिस्ट (सूची (facs [1: 3], facs [4: 5])) यह भी काम करता है जो अच्छा है अगर आप समय से पहले नहीं जानते कि facs एक कारक प्रकार है। – Keith

+0

इस तरह से मैन्युअल रूप से स्तर सेट करना मेरी विशेष समस्या के लिए काम नहीं करता है। (मेरे पास 0-आधारित स्तर हैं। मैं 1 घटा सकता था और फिर कारक का पुनर्निर्माण कर सकता था, लेकिन, यह भंगुर है और आरयू के लिए भी स्क्रूटाबिलिटी स्पेक्ट्रम के कम अंत में)। इसके बजाए (हुरे?) मैं 'असूची के साथ गया) सूची (...)) '। –

8

कारक को एक चरित्र वेक्टर बनने के लिए एक वैकल्पिक कामकाज है, फिर जब आप समाहित होते हैं तो वापस कनवर्ट करें।

cfacs <- as.character(facs) 
x <- c(cfacs[1:3], cfacs[4:5]) 

# Now choose between 
factor(x) 
# and 
factor(x, levels = levels(facs)) 
4

यह एक बहुत बुरी आर पकड़ लिया है। उन पंक्तियों के साथ, यहां एक ऐसा है जो मेरे समय के कई घंटे निगल गया।

x <- factor(c("Yes","Yes","No", "No", "Yes", "No")) 
y <- c("Yes", x) 

> y 
[1] "Yes" "2" "2" "1" "1" "2" "1" 
> is.factor(y) 
[1] FALSE 

ऐसा लगता है कि मुझे बेहतर सुधार रिची है, जो चरित्र के लिए सहकर्मी है।

> y <- c("Yes", as.character(x)) 
> y 
[1] "Yes" "Yes" "Yes" "No" "No" "Yes" "No" 
> y <- as.factor(y) 
> y 
[1] Yes Yes Yes No No Yes No 
Levels: No Yes 

जब तक आप स्तर को सही तरीके से सेट करते हैं, तब तक रिची का उल्लेख है।

0

अन्य उत्तर जो चरित्र को बदलने का उपयोग मैं कारकों को श्रेणीबद्ध करने के लिए निम्न समारोह का उपयोग कर रहा के आधार पर:

concat.factor <- function(...){ 
    as.factor(do.call(c, lapply(list(...), as.character))) 
} 

आप इस सुविधा का उपयोग बस के रूप में आप c का प्रयोग करेंगे कर सकते हैं।

0

यहाँ एक और तरीका एक कारक चर में जोड़ने के लिए है, जब सेटअप थोड़ा अलग है:

facs <- factor(1:3, levels=1:9, 
       labels=c("i", "want", "to", "be", "a", "factor", "not", "an", "integer")) 
facs 
# [1] i  want to  be  a  factor not  an  integer 
# Levels: a an be factor i integer not to want 
facs[4:6] <- levels(facs)[4:6] 
facs 
# [1] i  want to  be  a  factor 
# Levels: i want to be a factor not an integer 
0

इस कारण से मैं data.frames अंदर कारकों के साथ काम करना पसंद के लिए:

df <- data.frame(facs = as.factor(
     c("i", "want", "to", "be", "a", "factor", "not", "an", "integer"))) 

और सबसेट यह पंक्ति अनुक्रमणिका के बजाय subset() या dplyr :: फ़िल्टर() इत्यादि का उपयोग कर रहा है।

df1 <- head(df, 4) 
df2 <- tail(df, 2) 

उसके बाद आप उन्हें काफी आसानी से हेरफेर कर सकते हैं, जैसे::

dfc <- rbind(df1, df2) 
dfc$facs 
#[1] i  want to  be  an  integer 
#Levels: a an be factor i integer not to want 
संबंधित मुद्दे

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