在某些列和某些条件下替换 dfs 列表中的 NA

问题描述 投票:0回答:1

我有一个 dfs 列表:

my_list <- list(structure(list(col1 = c("v1", "v2", "v3", "V2", "V1"), col2 = c("wood", NA, "water", NA, "water"), col3 = c("cup", NA, "fork", NA, NA), col4 = c(NA, "pear", "banana", NA, "apple")), class = "data.frame", row.names = c(NA, -5L)), structure(list(col1 = c("v1", "v2"), col2 = c("wood", NA), col4 = c(NA, "pear")), class = "data.frame", row.names = c(NA, -2L)), structure(list(col1 = c("v1", "v2", "v3", "V3"), col3 = c("cup", NA, NA, NA), col4 = c(NA, "pear", "banana", NA)), class = "data.frame", row.names = c(NA, -4L)))
  
my_list

[[1]]
  col1  col2 col3   col4
1   v1  wood  cup   <NA>
2   v2  <NA> <NA>   pear
3   v3 water fork banana
4   V2  <NA> <NA>   <NA>
5   V1 water <NA>  apple

[[2]]
  col1 col2 col4
1   v1 wood <NA>
2   v2 <NA> pear

[[3]]
  col1 col3   col4
1   v1  cup   <NA>
2   v2 <NA>   pear
3   v3 <NA> banana
4   V3 <NA>   <NA>

我只想在 col3 中用“VAL”替换 NA,并且仅当 col1 是 v2 v3 时。

我找到了在某些列中替换 NA 的解决方案,但在某些列和其他条件下则不然(或者仅适用于单个 df,不适用于 dfs 列表。)

注意 col2 或 col3 不一定存在于所有 dfs 中。

我需要一个

lapply(list, function)
的解决方案,理想情况下。

所需输出:

  [[1]]
  col1  col2 col3   col4
1   v1  wood  cup   <NA>
2   v2  <NA>  VAL   pear 
3   v3 water fork banana
4   V2  <NA>  VAL   <NA>
5   V1 water <NA>  apple

[[2]]
  col1 col2 col4
1   v1 wood <NA>
2   v2 <NA> pear

[[3]]
  col1 col3   col4
1   v1  cup   <NA>
2   v2  VAL   pear
3   v3  VAL banana
4   V3  VAL   <NA>
r list mutate
1个回答
0
投票

你可以尝试:

lapply(
   my_list,
   \(x) if ('col3' %in% names(x)) transform(x, col3 = replace(col3, is.na(col3) & tolower(col1) %in% c('v2', 'v3'), 'VAL')) else x
)

输出:

[[1]]
  col1  col2 col3   col4
1   v1  wood  cup   <NA>
2   v2  <NA>  VAL   pear
3   v3 water fork banana
4   V2  <NA>  VAL   <NA>
5   V1 water <NA>  apple

[[2]]
  col1 col2 col4
1   v1 wood <NA>
2   v2 <NA> pear

[[3]]
  col1 col3   col4
1   v1  cup   <NA>
2   v2  VAL   pear
3   v3  VAL banana
4   V3  VAL   <NA>
© www.soinside.com 2019 - 2024. All rights reserved.