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