编辑:
请注意,这个问题中的问题只是我不小心把zoo::na.locf(l[[i]][1], na.rm=TRUE)放在了zoo::na.locf(l[[i]][1], na.rm=FALSE)上,而它应该是zoo::na.locf(l[[i]][1], na.rm=FALSE)。然而,当我想出这个问题时,这个问题已经得到了两个答案。因此,我没有删除这个问题(因为这是在人们提交答案之后不鼓励的),而是稍微修改了这个问题,以确保这个帖子至少有一些优点。
问题:
我有一张数据列表:
test_dat <- structure(list(...5 = c("euro", "euro", NA, NA, NA, NA,
NA, "dollar", NA)), row.names = c(NA, -9L), class = c("tbl_df",
"tbl", "data.frame"))
test_dat2 <- structure(list(...5 = c(NA, "euro", NA, NA, NA, NA,
NA, "dollar", NA)), row.names = c(NA, -9L), class = c("tbl_df",
"tbl", "data.frame"))
test_dat2
# A tibble: 9 × 1
...5
<chr>
1 NA
2 euro
3 NA
4 NA
5 NA
6 NA
7 NA
8 dollar
9 NA
l = list(test_dat , test_dat2)我想在df的列表中填写NA,但有时会有一个领先的NA,我不知道哪个条目是领先的NA。
for (i in seq_along(l)){
# Fill first column
l[[i]][1] <- zoo::na.locf(l[[i]][1])
}导致:
Error:
! Assigned data `zoo::na.locf(l[[i]][1])` must be compatible with existing data.
✖ Existing data has 9 rows.
✖ Assigned data has 8 rows.
ℹ Only vectors of size 1 are recycled.
Run `rlang::last_error()` to see where the error occurred.我以为下列办法能解决这个问题,但没有:
for (i in seq_along(l)){
# Fill first column
l[[i]][1] <- zoo::na.locf(l[[i]][1], na.rm=TRUE)
}期望产出:
test_dat2
# A tibble: 9 × 1
...5
<chr>
1 NA
2 euro
3 euro
4 euro
5 euro
6 euro
7 euro
8 dollar
9 dollar发布于 2022-10-24 12:58:46
我无法重现R 4.2.1,动物园1.8.11,dplyr 1.0.10和Tibble3.1.8的问题。问题中的代码与na.rm=FALSE一样适用于我,下面的任何一行都是如此。确保您拥有所有包和R的最新版本,重新启动R并在下面的Note中尝试代码,然后使用新的R实例在响应正文中尝试代码。
library(dplyr)
library(zoo)
l <- l.orig
for(i in seq_along(l)) l[[i]][1] <- na.locf(l[[i]][1], na.rm = FALSE)
l <- l.orig
for(i in seq_along(l)) l[[i]][, 1] <- na.locf(l[[i]][, 1], na.rm = FALSE)
l <- l.orig
for(i in seq_along(l)) l[[i]][[1]] <- na.locf(l[[i]][[1]], na.rm = FALSE)
l <- l.orig
lapply(l, function(x) replace(x, 1, na.locf(x[, 1], na.rm = FALSE)))如果l的每个组件只有一个列(在问题中所示的l中就是这种情况),那么简化是可能的。
l <- l.orig
for(i in seq_along(l)) l[[i]] <- na.locf(l[[i]], na.rm = FALSE)
l <- l.orig
lapply(l, na.locf, na.rm = FALSE)如果数据帧有相同的行数,我们可以将l表示为数据框架,并将na.locf应用于它,假设对所有列应用na.locf是可以的。
l <- l.orig
DF <- data.frame(l)
na.locf(DF, na.rm = FALSE)备注
library(dplyr)
l.orig <-
list(structure(list(...5 = c("euro", "euro", NA, NA, NA, NA,
NA, "dollar", NA)), row.names = c(NA, -9L), class = c("tbl_df",
"tbl", "data.frame")), structure(list(...5 = c(NA, "euro", NA,
NA, NA, NA, NA, "dollar", NA)), row.names = c(NA, -9L), class = c("tbl_df",
"tbl", "data.frame")))发布于 2022-10-24 12:22:50
也许你想要这样的东西。我假设您希望在列表中的两个数据文件中应用这一点。
library(tidyverse)
l |>
map(~fill(.x, everything(), .direction = "down"))
#> [[1]]
#> # A tibble: 9 x 1
#> ...5
#> <chr>
#> 1 euro
#> 2 euro
#> 3 euro
#> 4 euro
#> 5 euro
#> 6 euro
#> 7 euro
#> 8 dollar
#> 9 dollar
#>
#> [[2]]
#> # A tibble: 9 x 1
#> ...5
#> <chr>
#> 1 <NA>
#> 2 euro
#> 3 euro
#> 4 euro
#> 5 euro
#> 6 euro
#> 7 euro
#> 8 dollar
#> 9 dollarhttps://stackoverflow.com/questions/74180743
复制相似问题