आर

2013-01-02 40 views
6

मैं इस समस्या के साथ संघर्ष कर रहा है, और कुछ विफल रहता है के बाद कुछ मदद के लिए पूछना करने का निर्णय लिया में विभिन्न अवधि की दो वैक्टर की तुलना करें ..आर

यहाँ मेरी समस्या है, मैं के आधार पर इन दो वैक्टर विभाजित करना चाहते हैं उदाहरण के लिए, 2012-12-11 3/17 और 2012-12-12 होगा 0/7 होना चाहिए। हालांकि मैं ऐसा करने के तरीके जानने के लिए नहीं कर पा रहे ..

> ili 

2012-12-11 2012-12-13 2012-12-14 2012-12-17 
    3   6   7   1 
> no.ili 

2012-12-11 2012-12-12 2012-12-13 2012-12-14 2012-12-15 2012-12-16 2012-12-17 
    17   7  232  322   38   21   36 

अंतिम प्रयास दो वैक्टर से अधिक पाश के लिए गया था और एक नए वेक्टर तथापि के लिए मूल्य या शून्य जोड़ने जब मैं %in% का उपयोग ऐसा नहीं ' टी आदेश (जाहिर है) में मान रखा लेकिन यह भी काम नहीं करता है अगर मैं == का उपयोग ..

days.ili <- unique(one.three$timestamp) 
days <- unique(one.week$timestamp) 
ili.vec <- rep(0, length(days)) 

for (i in 1:length(days)) { 
    if (days.ili[i] %in% days) { 
     ili.vec[i] <- ili[i] 
    } else { 
     ili.vec[i] <- 0 
    } 
} 

मैं कुछ बात के बाद से मैं इस समस्या के माध्यम से देखने के लिए सक्षम नहीं किया जा रहा हूँ भूल जाना चाहिए .. कर सकते हैं कोई मुझे आर में इसे हासिल करने का सबसे अच्छा तरीका के बारे में कोई विचार देता है?

शायद एक विकल्प merge का उपयोग किया जाएगा ..

उत्तर

11

कुछ इस तरह:

res <- rep(0, length(no.ili)) 
where <- match(names(ili), names(no.ili)) 
res[ where ] <- ili/no.ili[where] 
names(res) <- names(no.ili) 
res 
# 2012-12-11 2012-12-12 2012-12-13 2012-12-14 2012-12-15 2012-12-16 2012-12-17 
# 0.17647059 0.00000000 0.02586207 0.02173913 0.00000000 0.00000000 0.02777778 
3

हाँ, विलय एक संभव समाधान है। चाल है, ili/no.ili डेटा फ्रेम को उनके कॉलम नामों के साथ एक अतिरिक्त चर, उर्फ ​​लंबे प्रारूप के रूप में पुन: स्थापित करने के लिए है। तब सभी तर्क के साथ विलय सही पर सेट किया जा रहा का उपयोग करें:

ili2 <- data.frame(date=colnames(ili),                             
        ili=as.numeric(ili[1,]),                           
        stringsAsFactors=FALSE)                            
no.ili2 <- data.frame(date=colnames(no.ili),                           
         no.ili=as.numeric(no.ili[1,]),                         
         stringsAsFactors=FALSE)                           

tmp <- merge(ili2, no.ili2, all=TRUE)                          

फिर विभाजन आप के लिए (और है कि मैं शुरू में overread था), पहले 0 के लापता मूल्यों को निर्धारित पूछा निष्पादित करने के लिए, तो विभाजित:

tmp[is.na(tmp[,"ili"]),"ili"] <- 0                              
tmp[is.na(tmp[,"no.ili"]),"no.ili"] <- 0                            

res <- tmp[,"ili"]/tmp[,"no.ili"] 
4

रोमेन के समाधान अधिक स्वच्छ है, लेकिन मान लिया गया no.ili हमेशा लंबे समय तक हो जाएगा ..

ili <- 
    c(3 , 6 , 7 , 1) 
names(ili) <- 
    as.Date(c('2012-12-11' , '2012-12-13' , '2012-12-14' , '2012-12-17')) 

no.ili <- 
    c(17 , 7 , 232 , 322 , 38 , 21 , 36) 
names(no.ili) <- 
    as.Date(c('2012-12-11' , '2012-12-12' , '2012-12-13' , '2012-12-14' , '2012-12-15' , '2012-12-16' , '2012-12-17')) 


ili.df <- data.frame(ili) 
ili.df$Date <- rownames(ili.df) 

no.ili.df <- data.frame(no.ili) 
no.ili.df$Date <- rownames(no.ili.df) 

x <- merge(ili.df , no.ili.df , all = TRUE) 

x[ is.na(x) ] <- 0 

result <- x$ili/x$no.ili 

names(result) <- x$Date 

result 
+0

मुझे उम्मीद है कि नोली हमेशा लंबे समय तक रहना चाहिए, हालांकि अगर ऐसा नहीं होता है तो यह सुनिश्चित करने के लिए यह एक शानदार तरीका है – pavid