我有多个数据集(例如: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)
或其他变化