首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用na.locf填充字符串NA时处理前导NA

使用na.locf填充字符串NA时处理前导NA
EN

Stack Overflow用户
提问于 2022-10-24 11:54:34
回答 2查看 68关注 0票数 -1

编辑:

请注意,这个问题中的问题只是我不小心把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)。然而,当我想出这个问题时,这个问题已经得到了两个答案。因此,我没有删除这个问题(因为这是在人们提交答案之后不鼓励的),而是稍微修改了这个问题,以确保这个帖子至少有一些优点。

问题:

我有一张数据列表:

代码语言:javascript
复制
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

代码语言:javascript
复制
for (i in seq_along(l)){
  # Fill first column
  l[[i]][1] <- zoo::na.locf(l[[i]][1])
}

导致:

代码语言:javascript
复制
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.

我以为下列办法能解决这个问题,但没有:

代码语言:javascript
复制
for (i in seq_along(l)){
  # Fill first column
  l[[i]][1] <- zoo::na.locf(l[[i]][1], na.rm=TRUE)
}

期望产出:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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实例在响应正文中尝试代码。

代码语言:javascript
复制
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中就是这种情况),那么简化是可能的。

代码语言:javascript
复制
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是可以的。

代码语言:javascript
复制
l <- l.orig
DF <- data.frame(l)
na.locf(DF, na.rm = FALSE)

备注

代码语言:javascript
复制
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")))
票数 1
EN

Stack Overflow用户

发布于 2022-10-24 12:22:50

也许你想要这样的东西。我假设您希望在列表中的两个数据文件中应用这一点。

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74180743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档