7

私はこの問題に苦しんでいて、いくつかが失敗した後、助けを求めることにしました。

これが私の問題です。たとえば、2012-12-11は3/17になり、2012-12-12は0/7になるように、これら2つのベクトルを日に基づいて分割したいと思います。しかし、私はこれを行う方法を理解できないようです。

> 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 

最後の試みは、2つのベクトルをループして、新しいベクトルに値またはゼロを追加することでしたが、使用する%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
     }
 }

この問題を見通すことができないので、私は何かを忘れているに違いありません。Rでこれを達成するための最良の方法について誰かが私に何か考えを教えてもらえますか?

おそらく、オプションはmerge..を使用するでしょう。

4

3 に答える 3

12

このようなもの:

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
于 2013-01-02T11:59:18.990 に答える
4

Romainのソリューションははるかにクリーンですが、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
于 2013-01-02T12:04:29.400 に答える
3

はい、マージは可能な解決策の 1 つです。秘訣は、ili/no.ili データ フレームを列名を追加の変数 (ロング フォーマットとも呼ばれる) として書き直すことです。次に、すべての引数を TRUE に設定してマージを使用します。

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)                                                                                                      

次に、あなたが要求した(そして最初に読み過ぎた)除算を実行するには、まず欠損値を0に設定してから除算します。

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

res <- tmp[,"ili"]/tmp[,"no.ili"]
于 2013-01-02T11:58:37.597 に答える