【问题标题】:How do I replicate values based on previous value如何根据以前的值复制值
【发布时间】:2014-04-06 16:37:05
【问题描述】:

如何根据前一个值复制一个值?

例如

我的数据集

name <- c("sergio",NA,NA,NA,NA,"John", NA,NA,NA,NA,NA,NA)
number <-c(1234,NA,NA,NA,NA,5678, NA,NA,NA,NA,NA,NA) 
mydata <- cbind(as.data.frame(name),as.data.frame(number))

新数据集

name     number
sergio    1234
sergio    1234
sergio    1234
sergio    1234 
John      5678
John      5678 
John      5678 
John      5678
John      5678 
John      5678
....

【问题讨论】:

    标签: r function replicate


    【解决方案1】:

    您可以使用“动物园”包中的na.locf

    mydata <- data.frame(
      name = c("sergio",NA,NA,NA,NA,"John", NA,NA,NA,NA,NA,NA),
      number = c(1234,NA,NA,NA,NA,5678, NA,NA,NA,NA,NA,NA))
    
    library(zoo)
    na.locf(mydata)
    #      name number
    # 1  sergio   1234
    # 2  sergio   1234
    # 3  sergio   1234
    # 4  sergio   1234
    # 5  sergio   1234
    # 6    John   5678
    # 7    John   5678
    # 8    John   5678
    # 9    John   5678
    # 10   John   5678
    # 11   John   5678
    # 12   John   5678
    

    如果您不想使用包,这里有一些可能会起作用:

    LOCF <- function(x) {
      A <- cumsum(!is.na(x))
      ave(x, A, FUN = function(x) x[1])
    }
    
    mydata[] <- lapply(mydata, LOCF)
    

    【讨论】:

    • 非常感谢,亲爱的!
    • @shasj,没问题。请考虑投票赞成答案(如果有帮助)和/或accepting the answer(如果它解决了您的问题)。
    【解决方案2】:

    你也可以使用一个简单的自制函数:

    copydown <- function(x) {
       for(iii in seq_along(x)[-1]) if(is.na(x[iii])) x[iii]<- x[iii-1]
       x
    }
    > copydown(name)
    # [1] "sergio" "sergio" "sergio" "sergio" "sergio" "John"   "John"   "John"  
    # [9] "John"   "John"   "John"   "John"
    mydata[] <- lapply(mydata, copydown)
    # notice [] -- so the result will be a data frame rather than a list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2019-11-09
      • 1970-01-01
      • 2012-05-29
      • 2021-11-12
      相关资源
      最近更新 更多