我有一个 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>
你可以尝试:
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>