在数据框列表中按条件替换col3列的NA值
问题描述
现有一个数据框列表my_list,定义如下:
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)))
该列表的输出结构为:
[[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列中,当col1的值为v2或v3(不区分大小写)时,将NA替换为"VAL"。要求用lapply(list, function)实现,同时兼容部分数据框不存在col2或col3的情况。
解决方案
通过lapply遍历列表,对每个数据框先判断是否同时包含col1和col3列,再按条件替换NA:
my_list_processed <- lapply(my_list, function(df) { # 检查数据框是否同时包含目标列 if (all(c("col1", "col3") %in% colnames(df))) { # 统一col1为小写,实现不区分大小写匹配 col1_lower <- tolower(df$col1) # 筛选需要替换的行:col1是v2/v3且col3为NA replace_idx <- col1_lower %in% c("v2", "v3") & is.na(df$col3) # 执行替换 df$col3[replace_idx] <- "VAL" } # 返回处理后的(或原)数据框 df })
处理后输出
[[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>
内容的提问来源于stack exchange,提问作者johnjohn
相关产品推荐
相关产品推荐

