2015-09-30 3 views
6

कहें कि मेरे पास ऐसे लोगों पर डेटा है जो कई विकल्पों के बीच चयन करते हैं। मेरे पास प्रति व्यक्ति एक पंक्ति है, और मैं प्रति व्यक्ति एक पंक्ति और विकल्प विकल्प चाहता हूं। इसलिए, यदि मेरे पास 10 विकल्प हैं जिनके पास 3 विकल्प हैं, तो अभी मेरे पास 10 पंक्तियां हैं, और मैं 30 होना चाहता हूं।समूहबद्ध चर के प्रत्येक मान के भीतर पूर्ण पंक्तियों को भरने के लिए मैं टिडीर का उपयोग कैसे करूं?

अन्य सभी चरों को प्रत्येक नई पंक्तियों में कॉपी किया जाना चाहिए। इसलिए, उदाहरण के लिए, यदि मेरे पास लिंग के लिए एक चर है, तो यह आईडी के भीतर स्थिर होना चाहिए। (मैं इस तरह से mnlogit साथ विश्लेषण करने के लिए मेरे सभी डेटा सेट कर रहा हूँ।)

यह स्थिति है कि दो tidyr काम करता है, complete और fill, के लिए डिजाइन किए गए थे की तरह लगता है। एक सरल उदाहरण का उपयोग करें:

library(lubridate) 
library(tidyr) 
dat <- data.frame(
    id = 1:3, 
    choice = 5:7, 
    c = c(9, NA, 11), 
    d = ymd(NA, "2015-09-30", "2015-09-29") 
    ) 

dat %>% 
    complete(id, choice) %>% 
    fill(everything()) 

# Source: local data frame [9 x 4] 
# 
#  id choice  c   d 
# (int) (int) (dbl)  (time) 
# 1  1  5  9  <NA> 
# 2  1  6  9  <NA> 
# 3  1  7  9  <NA> 
# 4  2  5  9  <NA> 
# 5  2  6  9 2015-09-30 
# 6  2  7  9 2015-09-30 
# 7  3  5  9 2015-09-30 
# 8  3  6  9 2015-09-30 
# 9  3  7 11 2015-09-29 

लेकिन यह कुछ समस्या है - डी के मूल्यों को सही ढंग से आगे बढ़ाया गया, लेकिन आईडी 1 से सी के मूल्यों (सही) एनए आईडी के लिए महत्व देता प्रतिस्थापित 2.

मैं वर्कअराउंड की कोशिश कर सकता हूं, जैसे सभी गुम मूल्यों को 99 9 के साथ बदलना, complete और fill चला रहा है, और उसके बाद 99 9 को NA के साथ बदलना। (मुझे लगता है कि मुझे दिनांक चर को वर्ण चर में परिवर्तित करना होगा और फिर यदि मैं इस मार्ग पर जाता हूं तो उन्हें दोबारा परिवर्तित कर दूंगा।) लेकिन हो सकता है कि यहां कोई व्यक्ति tidyr के साथ ऐसा करने के लिए एक साफ तरीके से जानता है?

संपादित करें: वांछित आउटपुट यहाँ है:

# Source: local data frame [9 x 4] 
# 
#  id  c   d choice 
# (int) (dbl)  (time) (int) 
# 1  1  9  <NA>  5 
# 2  1  9  <NA>  6 
# 3  1  9  <NA>  7 
# 4  2 NA 2015-09-30  5 
# 5  2 NA 2015-09-30  6 
# 6  2 NA 2015-09-30  7 
# 7  3 11 2015-09-29  5 
# 8  3 11 2015-09-29  6 
# 9  3 11 2015-09-29  7 
+1

क्षमा करें, 'समय' को 'पसंद' माना जाना चाहिए। मैं इसे ठीक कर दूंगा। –

+0

एक अद्यतन के रूप में, 'mlogit' में एक फ़ंक्शन है,' mlogit.data' जो इस समस्या को हल करता है। 'mlogit.data (डेटा, पसंद =" पसंद ", आकार =" चौड़ा ") 'वांछित परिणाम भी उत्पन्न करता है। मुझे पता है कि मैंने 'tidyr' समाधान के लिए कहा था, लेकिन, भविष्य के पाठकों के लिए, मैंने सोचा कि यह समाधान भी शामिल करना सहायक हो सकता है। –

उत्तर

8

आप पूरा c() का उपयोग कर के भीतर पूरा करने के लिए "समूह" चीजों की चाल का उपयोग कर सकते हैं। इससे ऐसा होता है कि यह समूहबद्ध चर के पूर्ववर्ती संयोजनों का उपयोग करके ही पूरा हो जाता है।

library(tidyr) 
dat %>% complete(c(id, c, d), choice) 
    id  c   d choice 
    (int) (dbl)  (time) (int) 
1  1  9  <NA>  5 
2  1  9  <NA>  6 
3  1  9  <NA>  7 
4  2 NA 2015-09-30  5 
5  2 NA 2015-09-30  6 
6  2 NA 2015-09-30  7 
7  3 11 2015-09-29  5 
8  3 11 2015-09-29  6 
9  3 11 2015-09-29  7 
+2

एचएम, ठीक है। तो ऐसा लगता है कि यहां समाधान पूरा हो गया है (सी (आईडी, सी, डी, [अन्य सभी चर जो बदलते नहीं हैं]), पसंद) ', और बस पूरी तरह से 'भरें' छोड़ दें। सही? –

+1

मैं इसे जोड़ दूंगा, लेकिन वांछित आउटपुट 'पूर्ण (डेटा, सी (आईडी, सी, डी), पसंद) द्वारा उत्पादित किया जाता है। –

+0

'tidyr' संस्करण' 0.5.1' का उपयोग करके यह अब और काम नहीं करता है। नीचे मेरा जवाब देखें। –

2

मुझे लगता है कि इससे पहले कि आप प्रतिगमन करने की जरूरत है आप डेटा को अलग जब आप इसे तैयार रखने, और फिर विलय से बेहतर कर रहे हैं।

subjectdata <- dat[,c("id", "c", "d")] 
questiondata <- dat[,c("id", "choice")] %>% complete(id, choice) 

और फिर

> merge(questiondata, subjectdata) 
    id choice c   d 
1 1  5 9  <NA> 
2 1  6 9  <NA> 
3 1  7 9  <NA> 
4 2  5 NA 2015-09-30 
5 2  6 NA 2015-09-30 
6 2  7 NA 2015-09-30 
7 3  5 11 2015-09-29 
8 3  6 11 2015-09-29 
9 3  7 11 2015-09-29 

आवश्यक के रूप में। डेटा फ्रेम में प्रश्नों के क्रम पर भरोसा किए बिना, आपको उपयोगकर्ता 2 के लिए वैध d कॉलम भी मिलता है।

+0

आप शायद सही हैं, अंत में यह संभवतः यह करने का सबसे साफ तरीका होगा। –

0

ऐसा लगता है कि spread और gather का उपयोग करना एक और तरीका है। spread प्रति संभावित उत्तर एक कॉलम बनाता है, और gather अलग-अलग कॉलम लेता है और उन्हें पंक्तियों में दोहराता है। इन आंकड़ों के साथ:

dat %>% 
    spread(choice, choice) %>% 
    gather(choice, drop_me, `5`:`7`) %>% # Drop me is a redundant column 
    select(-drop_me) %>% 
    arrange(id, choice) # reorders so that the answer matches 

# id c   d choice 
# 1 1 9  <NA>  5 
# 2 1 9  <NA>  6 
# 3 1 9  <NA>  7 
# 4 2 NA 2015-09-30  5 
# 5 2 NA 2015-09-30  6 
# 6 2 NA 2015-09-30  7 
# 7 3 11 2015-09-29  5 
# 8 3 11 2015-09-29  6 
# 9 3 11 2015-09-29  7 

मैंने यह देखने के लिए कोई परीक्षण नहीं किया है कि यह दक्षता में तुलना कैसे करता है।

7

@jeremycg उत्तर के अपडेट के रूप में। tidyr 0.5.1 (या यहां तक ​​कि संस्करण 0.4.0) से c() अब और काम नहीं करता है। का प्रयोग करें nesting() बजाय:

dat %>% 
complete(nesting(id, c, d), choice) 

नोट मैं, @jeremycg जवाब संपादित करने के लिए कोशिश कर रहा था के बाद से इस सवाल का जवाब समय यह लिखा गया था पर सही था (और इसलिए एक नया जवाब नहीं वास्तव में आवश्यक है) लेकिन दुर्भाग्य से संपादित मिला अस्वीकृत।

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

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