比较R中不同长度的两个向量

时间:2013-01-02 11:31:01

标签: r vector merge

我一直在努力解决这个问题,并决定在一些失败之后寻求帮助..

这是我的问题,我想根据当天划分这两个向量,例如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%时,它不会按顺序放置值(显然)但是如果我使用{{ 1}}它也不起作用..

==

我必须忘记一些事情,因为我无法看清这个问题。任何人都可以告诉我在R中实现这个目标的最佳方法吗?

也许选项将使用 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 } } ..

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:3)

是的,合并是一种可能的解决方案。诀窍是,重新显示ili / no.ili数据框及其列名作为附加变量,即长格式。然后使用merge并将all参数设置为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"]