Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/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
R-循环每一行,并用前一行的值填充_R_Loops - Fatal编程技术网

R-循环每一行,并用前一行的值填充

R-循环每一行,并用前一行的值填充,r,loops,R,Loops,我想测试特定列中的值是否包含NA值,如果是,则用前一行中的值填充NA空间。我仍在努力掌握apply函数系列的诀窍 例如,我想把这个: Date Balance 2012-01-01 1000 2012-01-02 NA 2012-01-03 NA 2012-01-04 1200 2012-01-05 1215 2012-01-06 NA 进入: 这是zoo软件包中的na.locf函数的任务。请参见?na.l

我想测试特定列中的值是否包含NA值,如果是,则用前一行中的值填充NA空间。我仍在努力掌握
apply
函数系列的诀窍

例如,我想把这个:

      Date   Balance
2012-01-01      1000
2012-01-02        NA
2012-01-03        NA
2012-01-04      1200
2012-01-05      1215
2012-01-06        NA
进入:


这是zoo软件包中的
na.locf
函数的任务。请参见
?na.locf

考虑
DF
是您的data.frame,然后:

DF <- read.table(text="      Date   Balance
2012-01-01      1000
2012-01-02        NA
2012-01-03        NA
2012-01-04      1200
2012-01-05      1215
2012-01-06        NA", header=TRUE)

library(zoo)
na.locf(DF)
        Date Balance
1 2012-01-01    1000
2 2012-01-02    1000
3 2012-01-03    1000
4 2012-01-04    1200
5 2012-01-05    1215
6 2012-01-06    1215

DF使用
data.table
roll=TRUE
也很好地做到了这一点

require(data.table)
# convert Date column to date format
df$Date <- as.Date(df$Date)
# keep this, as we'll remove rows with NA to use `roll`
dates   <- df$Date
# remove rows with NA
dt2     <- na.omit(data.table(df))
# set key to Date
setkey(dt2, "Date")
# use dates which has the NA rows that will be filled 
# with value from previous column with roll=T
dt2[J(dates), roll=T]

#          Date Balance
# 1: 2012-01-01    1000
# 2: 2012-01-02    1000
# 3: 2012-01-03    1000
# 4: 2012-01-04    1200
# 5: 2012-01-05    1215
# 6: 2012-01-06    1215
require(data.table)
#将日期列转换为日期格式

df$Date查看动物园包装good find@Jilber中的
na.locf
apply
系列在这里不起作用,因为您想要对给定值执行的操作取决于附近的值(即,您不能在
apply
函数中使用索引)。最简单的
base
方法可能是
for
循环(如果我错了请纠正我):
for(i in 1:length(DF$Balance))if(is.na(DF$余额[i])DF$余额[i]=DF$余额[i-1]
require(data.table)
# convert Date column to date format
df$Date <- as.Date(df$Date)
# keep this, as we'll remove rows with NA to use `roll`
dates   <- df$Date
# remove rows with NA
dt2     <- na.omit(data.table(df))
# set key to Date
setkey(dt2, "Date")
# use dates which has the NA rows that will be filled 
# with value from previous column with roll=T
dt2[J(dates), roll=T]

#          Date Balance
# 1: 2012-01-01    1000
# 2: 2012-01-02    1000
# 3: 2012-01-03    1000
# 4: 2012-01-04    1200
# 5: 2012-01-05    1215
# 6: 2012-01-06    1215