You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在数据框列表中按条件替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:23:25