編輯:
請注意,這個問題中的問題只是我不小心放zoo::na.locf(l[[i]][1], na.rm=TRUE)了,應該是什么時候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)
我想NA在df的串列中填寫's,但有時會有一個前導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
uj5u.com熱心網友回復:
我無法重現 R 4.2.1、zoo 1.8.11、dplyr 1.0.10 和 tibble 3.1.8 的問題。問題中的代碼與na.rm=FALSE下面的任何行一樣對我有用。確保您擁有所有包和 R 的最新版本并重新啟動 R 并嘗試下面注釋中的代碼,然后使用新的 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")))
uj5u.com熱心網友回復:
也許你想要這樣的東西。我假設您想在串列中的兩個資料框中應用它。
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 dollar
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/520417.html
標籤:r细绳列表for循环呐
上一篇:使用ExecutorService并行執行4個db2fetch方法。這是正確的方法嗎?
下一篇:標記S3存盤桶物件問題
