Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在数据框中进行的最后一次观察?_R_Matrix_Apply_Dataframe - Fatal编程技术网

R 在数据框中进行的最后一次观察?

R 在数据框中进行的最后一次观察?,r,matrix,apply,dataframe,R,Matrix,Apply,Dataframe,我希望为我正在处理的数据集实现一个“上一次观察结转”,该数据集末尾缺少值 下面是一个简单的代码(后面的问题): LOCF这已经存在: library(zoo) na.locf(data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA))) 我最终通过一个循环解决了这个问题: fillInTheBlanks <- function(S) { L <- !is.na(S) c(S[L][1], S[L])[cumsum(L)+1] } LOC

我希望为我正在处理的数据集实现一个“上一次观察结转”,该数据集末尾缺少值

下面是一个简单的代码(后面的问题):

LOCF这已经存在:

library(zoo)
na.locf(data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA)))

我最终通过一个循环解决了这个问题:

fillInTheBlanks <- function(S) {
  L <- !is.na(S)
  c(S[L][1], S[L])[cumsum(L)+1]
}


LOCF.DF <- function(xx)
{
    # won't work well if the first observation is NA

    orig.class <- lapply(xx, class)

    new.xx <- data.frame(t( apply(xx,1, fillInTheBlanks) ))

    for(i in seq_along(orig.class))
    {
        if(orig.class[[i]] == "factor") new.xx[,i] <- as.factor(new.xx[,i])
        if(orig.class[[i]] == "numeric") new.xx[,i] <- as.numeric(new.xx[,i])
        if(orig.class[[i]] == "integer") new.xx[,i] <- as.integer(new.xx[,i])   
    }

    #t(na.locf(t(a)))

    return(new.xx)
}

a <- data.frame(rep("a",4), 1:4,1:4, c(1,NA,NA,NA))
LOCF.DF(a)

填空这个问题由来已久,但对后代来说。。。最好的解决方案是将data.table包与roll=T一起使用。

而不是
apply()
您可以使用
lappy()
,然后将结果列表转换为
data.frame

LOCF <- function(x) {
    # Last Observation Carried Forward (for a left to right series)
    LOCF <- max(which(!is.na(x))) # the location of the Last Observation to Carry Forward
    x[LOCF:length(x)] <- x[LOCF]
    return(x)
}

a <- data.frame(rep("a",4), 1:4, 1:4, c(1, NA, NA, NA))
a
data.frame(lapply(a, LOCF))

LOCF有很多包正好实现了这个功能。
(具有相同的基本功能,但在附加选项上存在一些差异)

  • 时空::na.locf
  • inputets::na.locf
  • 动物园::na.locf
  • xts::na.locf

如果您不想为na.locf函数加载像zoo这样的大型软件包,这里有一个简短的解决方案,如果输入向量中有一些领先的NAs,它也可以工作

na.locf <- function(x) {
  v <- !is.na(x)
  c(NA, x[v])[cumsum(v)+1]
}

na.locf添加新的
tidyr::fill()
函数,用于在列中结转最后一个观察值,以填充
na
s:

a <- data.frame(col1 = rep("a",4), col2 = 1:4, 
                col3 = 1:4, col4 = c(1,NA,NA,NA))
a
#   col1 col2 col3 col4
# 1    a    1    1    1
# 2    a    2    2   NA
# 3    a    3    3   NA
# 4    a    4    4   NA

a %>% tidyr::fill(col4)
#   col1 col2 col3 col4
# 1    a    1    1    1
# 2    a    2    2    1
# 3    a    3    3    1
# 4    a    4    4    1
a%tidyr::fill(col4)
#col1 col2 col3 col4
#一一
#2 a 2 1
#3 a 3 1
#4 a 4 1

+1和rseek.org当然会立即点击这个作为第一个结果。我的出价没有被rseek点击-谢谢Shane。但我担心它不起作用。(它填充了第3列,而不是每一行)如果您在stackoverflow.com上搜索
[r]locf
,也可以找到这个。嗨,Shane,我在搜索中也找不到解决方案(尽管这个线程很好:)如果第一个值丢失,那么您可以判断如何处理它。没有任何函数可以为您解决该问题。您需要将整个内容保留为缺失,或者设置默认的第一个值(例如零)。如果能在data.table中有一些快速的功能就太好了。我最喜欢这个解决方案。如果您想将其应用于原始问题中的
data.frame
,可以通过
a[]=lapply(a,na.locf)
使用它。
na.locf <- function(x) {
  v <- !is.na(x)
  c(NA, x[v])[cumsum(v)+1]
}
a <- data.frame(col1 = rep("a",4), col2 = 1:4, 
                col3 = 1:4, col4 = c(1,NA,NA,NA))
a
#   col1 col2 col3 col4
# 1    a    1    1    1
# 2    a    2    2   NA
# 3    a    3    3   NA
# 4    a    4    4   NA

a %>% tidyr::fill(col4)
#   col1 col2 col3 col4
# 1    a    1    1    1
# 2    a    2    2    1
# 3    a    3    3    1
# 4    a    4    4    1