/ / कॉलम नामों में R- डुप्लिकेट के साथ आईडी-चर के साथ Reshape - r, reshape2

कॉलम नामों में आईडी-वेरिएबल के साथ दोबारा बदलें [डुप्लिकेट] - आर, reshape2

मैंने अभी कुछ समय के लिए R के साथ काम किया है, लेकिनReshape या reshape2 पैकेज का बहुत कम उपयोग किया है। मैं वर्तमान में एक डेटा सेट को विस्तृत से लंबे प्रारूप में फिर से सेट करने की कोशिश कर रहा हूं जहां सूचक चर चर नामों का हिस्सा हैं। यह मेरे डेटा फ्रेम की वर्तमान संरचना है:

mydf <- data.frame(district = c(1:2),
v.mandate = c(1, 3),
s.mandate = c(2, 4),
v.perc = c(.4, .3),
s.perc = c(.5, .6))

> mydf
district v.mandate s.mandate v.perc s.perc
1        1         1         2    0.4    0.5
2        2         3         4    0.3    0.6

मैं इसे लंबे प्रारूप में फेरबदल करना चाहता हूं और "वी" को निकालना चाहता हूं। और "एस।" आईडी चर के रूप में (वास्तविक डेटा सेट में सूची लंबी है)। नीचे उदाहरण देखें।

mydf2 <- data.frame(district = c(1, 1, 2, 2),
party = c("v", "s", "v", "s"),
mandate = c(1, 2, 3, 4),
perc = c(.4, .5, .3, .6))

> mydf2
district party mandate perc
1        1     v       1  0.4
2        1     s       2  0.5
3        2     v       3  0.3
4        2     s       4  0.6

मैंने रिशेप और मेल्ट दोनों का उपयोग करने की कोशिश की हैफ़ंक्शंस, लेकिन मैं चर नामों से संकेतक चर निकालने के लिए प्रतीत नहीं कर सकता। इसके बजाय, डेटा सेट को लंबे प्रारूप में फिर से आकार दिया जाता है, लेकिन आईडी चर के रूप में पूर्ण चर नामों के साथ। नीचे उदाहरण देखें।

> melt(mydf, id.vars=1)
district  variable value
1        1 v.mandate   1.0
2        2 v.mandate   3.0
3        1 s.mandate   2.0
4        2 s.mandate   4.0
5        1    v.perc   0.4
6        2    v.perc   0.3
7        1    s.perc   0.5
8        2    s.perc   0.6

यह एक तुच्छ समस्या हो सकती है, लेकिन मैं "ऑन-लाइन एक समाधान खोजने में सक्षम नहीं हूं।"

किसी भी मदद की बहुत सराहना करते हैं!

उत्तर:

जवाब के लिए 2 № 1

मैं अक्षम हो सकता हूं, लेकिन ऐसा लगता है कि आपने अपने चरों का नाम बदल दिया है, जो कि आकृति ग्रहण करता है (जैसे। v.mandate के बजाय mandate.v)। मैंने उनके नामकरण को उलट दिया, और यह काम करने के लिए मिल सकता है:

mydf <- data.frame(district = c(1:2),
mandate.v = c(1, 3),
mandate.s = c(2, 4),
perc.v = c(.4, .3),
perc.s = c(.5, .6))

#reshape data
mydf2 = reshape(mydf,
varying=2:5, #variables 2:5 varies
direction = "long", #towards long
timevar="party", #the grouping variable
idvar="district", #identifying variable
sep = ".") #separated by dots

यह देता है:

> mydf2
district party mandate perc
1.v        1     v       1  0.4
2.v        2     v       3  0.3
1.s        1     s       2  0.5
2.s        2     s       4  0.6

संपूर्ण डेटाफ़्रेम में नामों को उलटने के लिए आपको किसी प्रकार के स्वचालित तरीके की आवश्यकता हो सकती है। मैंने इसे मैन्युअल रूप से ऊपर किया था क्योंकि केवल 4 चर थे। यदि आपके पास 100 हैं, तो वह इसके लायक नहीं है।


जवाब के लिए 2 № 2

data.table v1.9.5 सीधे कई कॉलम में पिघल सकते हैं। स्थापाना निर्देश.

require(data.table) # v1.9.5+
ans = melt(setDT(mydf), measure=patterns("^mandate", "^perc"),
value.name=c("mandate", "perc"))
#    district variable mandate perc
# 1:        1        1       1  0.4
# 2:        2        1       3  0.3
# 3:        1        2       2  0.5
# 4:        2        2       4  0.6

setattr(ans$variable, "levels", c("v", "s"))

आप उपयोग कर स्तरों के निष्कर्षण को स्वचालित कर सकते हैं gsub()। अभी तक स्तरों को निकालने का कोई सीधा तरीका नहीं है (यह सभी मामलों में मुझे सीधा नहीं लगता है)।