R-循环每一行,并用前一行的值填充
我想测试特定列中的值是否包含NA值,如果是,则用前一行中的值填充NA空间。我仍在努力掌握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
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