2015-07-24 24 views
7

का उपयोग कर एक मरीज की आईडी के साथ पंक्तियों में से एक में निहित जानकारी के साथ डेटा फ्रेम में मैं आर में निम्न डेटा फ्रेम:भरण 'एनए के आर

ID Information 
1 Yes 
1 NA 
1 NA 
1 Yes 
2 No 
2 NA 
2 NA 
3 NA 
3 NA 
3 Maybe 
3 NA 

मैं पंक्तियों को एनए के साथ शामिल भरने की आवश्यकता जो भी जानकारी उस आईडी के अनुरूप पंक्तियों में से एक में निहित है। मैं इस करना चाहते हैं: जहाँ तक मुझे पता है

ID Information 
1 Yes 
1 Yes 
1 Yes 
1 Yes 
2 No 
2 No 
2 No 
3 Maybe 
3 Maybe 
3 Maybe 
3 Maybe 

, जानकारी (यानी हां/नहीं/शायद) एक आईडी के भीतर परस्पर विरोधी नहीं है लेकिन यह दोहराया जा सकता है (बदसूरत प्रारूप के बारे में क्षमा करें। मैं एक नौसिखिया हूँ और चित्र पोस्ट नहीं कर सकता)।

धन्यवाद!

उत्तर

5

एक विकल्प data.table का उपयोग कर रहा है। हम 'data.frame' को 'data.table' (setDT(df1)) में 'आईडी' द्वारा समूहीकृत करते हैं, हम unique गैर-एनए तत्व के रूप में ':=)' सूचना 'असाइन करते हैं।

library(data.table)#v1.9.5+ 
setDT(df1)[, Information:=unique(Information[!is.na(Information)]), by = ID] 
df1 
#  ID Information 
# 1: 1   Yes 
# 2: 1   Yes 
# 3: 1   Yes 
# 4: 1   Yes 
# 5: 2   No 
# 6: 2   No 
# 7: 2   No 
# 8: 3  Maybe 
# 9: 3  Maybe 
# 10: 3  Maybe 
# 11: 3  Maybe 

या हम 'एनए' पंक्तियों को हटाने के बाद डेटासेट की अनूठी पंक्तियों के साथ डेटासेट में शामिल हो सकते हैं। यहाँ, मैं data.table

setDT(unique(na.omit(df1)))[df1['ID'], on='ID'] 

की devel संस्करण का उपयोग या हम dplyr, 'आईडी' के आधार पर वर्गीकृत उपयोग करें, हम 'जानकारी' arrange ताकि 'एनए' आखिरी हो जाएगा, के रूप में 'जानकारी' बनाने 'सूचना' का पहला मूल्य।

uniqueCombns <- unique(dat[complete.cases(dat),]) 
merge(dat["ID"], uniqueCombns, by="ID", all.x=T) 

जहां Dat अपने dataframe

+1

एक और विकल्प 'z.'' से 'na.locf' का उपयोग इस 'setDT (d) [, सूचना: = na.locf (सूचना), = आईडी द्वारा' na.locf' का उपयोग करेगा] ' –

+0

@ वीरेंद्रगड़ेकर' ना 'जैसा दिखता है। locf' उदाहरण के लिए काम किया। तो, शायद मैं गलत था। – akrun

+1

@ वीरेंद्रगड़ेकर मुझे लगता है कि आपको 'ट्रांसफॉर्म' या 'उत्परिवर्तन' की आवश्यकता है क्योंकि 'सारांश' केवल एक पंक्ति या इसके परिणामस्वरूप संक्षेप में है। – akrun

3

यहाँ ddply

library(zoo) 
library(plyr) 

ddply(d, .(ID), mutate, Information = na.locf(Information)) 

# ID Information 
#1 1   Yes 
#2 1   Yes 
#3 1   Yes 
#4 1   Yes 
#5 2   No 
#6 2   No 
#7 2   No 
#8 3  Maybe 
#9 3  Maybe 
#10 3  Maybe 
#11 3  Maybe 
+1

बहुत बहुत धन्यवाद! – Bogs

2

साथ या आधार आर में na.locf का उपयोग कर एक विकल्प है "और कोई भ्रम नहीं है, आप भी कर सकते हैं, जब तक कि मैं अनदेखा न हो कुछ oring):

levels(DF$Information)[approxfun(DF$ID, DF$Information, method = "constant")(DF$ID)] 
# [1] "Yes" "Yes" "Yes" "Yes" "No" "No" "No" "Maybe" "Maybe" "Maybe" "Maybe" 
+0

बहुत बहुत धन्यवाद! – Bogs

1

DF$information के बाद से एक वैध "कारक है:

library(dplyr) 
df1 %>% 
    group_by(ID) %>% 
    arrange(Information) %>% 
    mutate(Information= first(Information)) 
1

मान लिया जाये कि वहाँ वास्तव में एक-एक समूह हम बस NAS छोड़ देते हैं और सभी समूह द्वारा यह कर दूसरों के लिए शेष मूल्य प्रदान कर सकते हैं में गैर एनए। कोई पैकेज नहीं इस्तेमाल कर रहे हैं:

transform(df, Information = ave(Information, ID, FUN = na.omit)) 

दे रही है:

ID Information 
1 1   Yes 
2 1   Yes 
3 1   Yes 
4 1   Yes 
5 2   No 
6 2   No 
7 2   No 
8 3  Maybe 
9 3  Maybe 
10 3  Maybe 
11 3  Maybe 

यदि प्रत्येक समूह में एक से अधिक गैर-एनए हो सकता है लेकिन वे सभी एक ही तो function(x) na.omit(x)[1] साथ na.omit की जगह है।

+0

आपके उत्तर के लिए धन्यवाद लेकिन एनए मान हमेशा समूह में नहीं थे (आप इसे आईडी 3 पर देख सकते हैं)। वैसे भी धन्यवाद! – Bogs

+0

ठीक है। उस मामले में मैंने जवाब बदल दिया है। –

+0

बहुत बहुत धन्यवाद! – Bogs

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