r语言 - Apply na.Locf到多个数据集



我有多个数据集(例如:data01, data02..)。在所有这些数据集中,我想应用na。Locf到var1,并从应用了'var1'的Locf中创建一个新的变量'var2'。我尝试使用以下代码:

L =列表(data01 data02)for (i in L){i$var2 <- na.locf(i$var1)}

但是,当我尝试使用代码读取locf列时:

头(data01 var2美元)

给出的结果是NULL。

有几个问题:

问题i中的
  • 是每个数据帧的副本,因此L不会被更改。索引到L中,以确保是L中的数据帧被更改。
  • 使用na。Locf0或等价的na.locf(…na。rm = FALSE)以确保输出与输入长度相同
  • L中的data01和data02是data01和data02的副本,修改其中一个不会修改另一个。这就是为什么你得到NULL。

使用内置BOD数据帧构造示例输入:

library(zoo)
# construct sample input
BOD1 <- BOD2 <- BOD
BOD1$Time[c(1, 3)] <- BOD2$Time[c(3, 5)] <- NA
L <- list(BOD1, BOD2)
for(i in seq_along(L)) L[[i]]$Time2 <- na.locf0(L[[i]]$Time)

给:

str(L)
List of 2
$ :'data.frame':       6 obs. of  3 variables:
..$ Time  : num [1:6] NA 2 NA 4 5 7
..$ demand: num [1:6] 8.3 10.3 19 16 15.6 19.8
..$ Time2 : num [1:6] NA 2 2 4 5 7
..- attr(*, "reference")= chr "A1.4, p. 270"
$ :'data.frame':       6 obs. of  3 variables:
..$ Time  : num [1:6] 1 2 NA 4 NA 7
..$ demand: num [1:6] 8.3 10.3 19 16 15.6 19.8
..$ Time2 : num [1:6] 1 2 2 4 4 7
..- attr(*, "reference")= chr "A1.4, p. 270"

以上任何一种方法都可以,而不是修改L生成一个新的列表:

L2 <- lapply(L, function(x) { x$Time2 <- na.locf0(x$Time); x })
L3 <- lapply(L, transform, Time2 = na.locf0(Time))

如果你的目标是修改BOD1和BOD2,而不是用修改后的BOD1和BOD2创建一个列表,那么下面的代码可以做到这一点(尽管如果你打算迭代它们,通常最好将对象组织在列表中),而不是将它们松散地放在全局环境中。

nms <- c("BOD1", "BOD2")
for(nm in nms) assign(nm, transform(get(nm), Time2 = na.locf0(Time)))

nms <- c("BOD1", "BOD2")
for(nm in nms) .GlobalEnv[[nm]]$Time2 <- na.locf0(.GlobalEnv[[nm]]$Time2)

或其他变化

最新更新