【问题标题】:Compare two vectors of different length in R比较R中不同长度的两个向量
【发布时间】:2013-01-02 11:31:00
【问题描述】:

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

这是我的问题,我想根据天划分这两个向量,例如 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
     }
 }

我一定是忘记了一些事情,因为我无法看透这个问题。谁能告诉我在 R 中实现这一目标的最佳方法?

也许一个选项将使用merge ..

【问题讨论】:

    标签: r vector merge


    【解决方案1】:

    类似这样的:

    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
    

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 我希望 no.ili 应该总是比 ili 长,但是如果这没有发生,那肯定是实现这一目标的好方法
      【解决方案3】:

      是的,合并是一种可能的解决方案。诀窍是,将 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"]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-02
        • 2021-02-25
        • 1970-01-01
        相关资源
        最近更新 更多