मेरे पास एन्क्रिप्टेड आईएमईआई (प्रति सेलफोन अद्वितीय लेकिन प्रति उपयोगकर्ता अद्वितीय नहीं) और सेलफोन ब्रांड सहित एक समय श्रृंखला/पैनल डेटा है। IMEI में बहुत अधिक अनुपलब्ध मान मौजूद नहीं हैं, लेकिन सेलफ़ोन ब्रांड में बहुत से अनुपलब्ध मान मौजूद हैं। चूंकि अद्वितीय आईएमईआई एक अद्वितीय फोन से मेल खाता है, हम आईएमईआई द्वारा लापता ब्रांडों का अनुमान लगा सकते हैं। मेरा समाधान ब्रांड तालिका में आईएमईआई और मेरे वर्तमान डेटा के साथ merge(by=IMEI) बनाना है। मैं बस उत्सुक हूँ। क्या इसे करने का कोई और तरीका है? उदाहरण के लिए, dplyr या data.table में, या केवल r-बेस फ़ंक्शन में। मेरा डेटा लगभग 3 मिलियन अवलोकनों के साथ बड़ा है।

नोट: एक उपयोगकर्ता के पास कई डिवाइस/आईएमईआई हो सकते हैं; ब्रांड कुछ समय गायब हैं, या तो शुरुआती समय में, मध्य या अंत में।

# create sample data
user<-rep(letters[1:5],each=6)
time<-rep(1:6,5)
imei<-c(rep(100,6),rep(200,4),NA,201,rep(300,6),rep(400,3),401,404,404,rep(500,5),NA)
brand<-c(rep('Apple',3),NA,NA,'Apple',NA,rep('ZTE',4),NA,NA,NA,NA,rep('Samsung',3),NA,'Huawei',NA,'Nokia','HTC',NA,rep('Moto',6))
dt<-data.frame(time,user,imei,brand)

    #data
  time user imei   brand
1     1    a  100   Apple
2     2    a  100   Apple
3     3    a  100   Apple
4     4    a  100    <NA>
5     5    a  100    <NA>
6     6    a  100   Apple
7     1    b  200    <NA>
8     2    b  200     ZTE
9     3    b  200     ZTE
10    4    b  200     ZTE
11    5    b   NA     ZTE
12    6    b  201    <NA>
13    1    c  300    <NA>
14    2    c  300    <NA>
15    3    c  300    <NA>
16    4    c  300 Samsung
17    5    c  300 Samsung
18    6    c  300 Samsung
19    1    d  400    <NA>
20    2    d  400  Huawei
21    3    d  400    <NA>
22    4    d  401   Nokia
23    5    d  404     HTC
24    6    d  404    <NA>
25    1    e  500    Moto
26    2    e  500    Moto
27    3    e  500    Moto
28    4    e  500    Moto
29    5    e  500    Moto
30    6    e   NA    Moto
3
News_is_Selection_Bias 23 सितंबर 2016, 02:54

2 जवाब

सबसे बढ़िया उत्तर

यहाँ एक data.table दृष्टिकोण है:

library(data.table)
setDT(dt)
setkey(dt, imei)
dt[dt, brand := unique(na.omit(brand)), imei]
#     time user imei   brand
#  1:    5    b   NA     ZTE
#  2:    6    e   NA    Moto
#  3:    1    a  100   Apple
#  4:    2    a  100   Apple
#  5:    3    a  100   Apple
#  6:    4    a  100   Apple
#  7:    5    a  100   Apple
#  8:    6    a  100   Apple
#  9:    1    b  200     ZTE
# 10:    2    b  200     ZTE
# 11:    3    b  200     ZTE
# 12:    4    b  200     ZTE
# 13:    6    b  201      NA
# 14:    1    c  300 Samsung
# 15:    2    c  300 Samsung
# 16:    3    c  300 Samsung
# 17:    4    c  300 Samsung
# 18:    5    c  300 Samsung
# 19:    6    c  300 Samsung
# 20:    1    d  400  Huawei
# 21:    2    d  400  Huawei
# 22:    3    d  400  Huawei
# 23:    4    d  401   Nokia
# 24:    5    d  404     HTC
# 25:    6    d  404     HTC
# 26:    1    e  500    Moto
# 27:    2    e  500    Moto
# 28:    3    e  500    Moto
# 29:    4    e  500    Moto
# 30:    5    e  500    Moto
#     time user imei   brand

यहाँ एक dplyr + zoo::na.locf दृष्टिकोण दिया गया है:

library(dplyr)
library(zoo)
fillna <- function(x) na.locf(na.locf(x, na.rm = FALSE), fromLast = TRUE, na.rm = FALSE)
dt <- dt %>% group_by(imei) %>% mutate(brand = fillna(brand))
2
Weihuang Wong 23 सितंबर 2016, 04:37

इसे करने का एक क्लासिक आर तरीका यहां दिया गया है:

dt$brand <- levels(dt$brand)[ave(as.numeric(dt$brand), dt$imei, FUN= function(x) mean(x, na.rm=TRUE))]

Ave एक संख्यात्मक तर्क लेता है और अन्य तर्कों के स्तर के अनुसार उस पर FUN करता है। यह तब एक वेक्टर देता है जो मूल डेटा के समान लंबाई का होता है और प्रत्येक आईएमईआई के लिए समान स्तर होता है।

क्योंकि यह एक संख्यात्मक तर्क लेता है, आप केवल कारक को एव में डंप नहीं कर सकते हैं और सबसे लंबा परिणाम ले सकते हैं। आपको एक संख्या में फेंकना होगा। खैर, कारक उन संख्याओं को मैप करते हैं जो स्तरों के अनुरूप होती हैं। तो, आप माध्य स्तर (लापता को हटाने के बाद) पा सकते हैं और फिर इसे मूल स्तरों के लिए एक सूचकांक के रूप में उपयोग कर सकते हैं।

1
pdb 23 सितंबर 2016, 04:32