Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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
Performance 查找并替换每列中不带for循环的第一个NA_Performance_R_For Loop_Apply_Na - Fatal编程技术网

Performance 查找并替换每列中不带for循环的第一个NA

Performance 查找并替换每列中不带for循环的第一个NA,performance,r,for-loop,apply,na,Performance,R,For Loop,Apply,Na,尝试在没有For循环的情况下执行此操作,但无法解决此问题 我想用默认值0.0000001替换列中的第一个NA 我正在进行上一次观察结转(LOCF)插补,但想给它一个默认值 如果我有以下data.frame: > Col1 Col2 Col3 Col4 > 1 NA 10 99 > NA NA 11 99 > 1

尝试在没有For循环的情况下执行此操作,但无法解决此问题

我想用默认值0.0000001替换列中的第一个NA

我正在进行上一次观察结转(LOCF)插补,但想给它一个默认值

如果我有以下data.frame:

> Col1        Col2        Col3        Col4
> 1           NA          10          99
> NA          NA          11          99
> 1           NA          12          99
> 1           NA          13          NA
我希望它看起来像这样:

> Col1        Col2        Col3        Col4
> 1           0.0000001   10          99
> 0.0000001   NA          11          99
> 1           NA          12          99
> 1           NA          13          0.0000001 
这是代码我haev的工作,但非常缓慢

#Temporary change for missing first observation
for (u in 1:ncol(data.frame))
{
  for (v in 1:nrow(data.frame)) 
  {
    #Temporary change the first observations in a row to 0.0000001 until it encounters a value that isn't NA
    if(is.na(temp_equity_df_merge2[v,u]))
    {
        temp_equity_df_merge2[v,u]=0.0000001
    }
    else break
  }
我想使用apply或其他更快的变体。我正在循环超过20列和100万行


提前感谢您的帮助。

您可以对每一列应用一个函数:

myfun <- function(x) {
  x[which(is.na(x))[1]] <- 0.1

  return(x)
}

> data.frame(apply(dat, 2, myfun))
   v1  v2 v3   v4
1 1.0 0.1 10 99.0
2 0.1  NA 11 99.0
3 1.0  NA 12 99.0
4 1.0  NA 13  0.1
> 
myfun

根据注释,您可以使用
apply
将函数应用于每列。该函数将用0.0000001替换第一个
NA
,并返回一个矩阵。然后您可以使用
na.locf
填写剩余的
na
s。最后,我将其全部包装在
data.frame
中,因为您要求的是
data.frame
而不是
matrix

data.frame(na.locf(apply(dat, 2, function(x) {
    firstNA <- head(which(is.na(x)), 1) #position of first NA
    x[firstNA] <- 0.0000001
    x
})))
   Col1  Col2 Col3    Col4
1 1e+00 1e-07   10 9.9e+01
2 1e-07 1e-07   11 9.9e+01
3 1e+00 1e-07   12 9.9e+01
4 1e+00 1e-07   13 1.0e-07
数据帧(na.locf)(应用(dat,2,函数(x){

firstNA鉴于您有这么大的数据集,我会使用
data.table
set
来避免复制数据。这两种
apply
解决方案至少复制数据一次

该解决方案涉及一个for循环,但它是一个有效的循环(执行长度(valid_replace)操作,每个操作都是瞬时的)

库(data.table)
DT<-as.数据表(dat)

由于您提到LOCF,您可能对
library('zoo');?na.LOCF
感兴趣,我很感激。这就是我正在使用的内容,但如果第一个观察值为空,它会忽略它(例如,它不会为第2列返回任何内容)。而且,它似乎只对每一列单独起作用,所以当我后来使用cbind时,它们的列将具有不同的长度。
library(data.table)

DT< -as.data.table(dat)

replacing <- lapply(DT, function(x)which(is.na(x))[1])

valid_replace <- Filter(Negate(is.na), replacing)

replace_with <- 0.0001

for(i in seq_along(valid_replace)){
  set(DT, i = valid_replace[i], j = names(valid_replace)[i], value = replace_with)
}