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

基于条件逻辑为tibble数据框生成新列并标记含NA列名

R代码实现:处理tibble数据的行计算与NA列记录

原始样本数据

# A tibble: 10 x 3
       x     y     z
   <int> <dbl> <dbl>
 1     1   1       5
 2     2   3       6
 3     3   4       7
 4     4   7       8
 5     5  NA       9
 6     6  12      10
 7     7  NA      NA
 8     8   2      20
 9     9   5.5    25
10    10  NA       8

数据定义

df <- tibble(
  x = 1:10, 
  y = c(1, 3, 4, 7, NA, 12, NA, 2, 5.5, NA), 
  z = c(5:10, NA, 20, 25, 8)
)

需求

  • 新增value列:
    • 该行无NA值:计算行求和
    • 存在NA值但至少两列有有效值:取该行最大值乘以1.2
    • 仅一列有有效值:直接取该值
  • 新增NA_column列:记录该行包含NA的列名(多列用逗号分隔)

用户未完成代码

df %>% 
  mutate(
    value = case_when(any_vars(is.na()) ~ BIGGEST VALUE * 1.2,
                      TRUE ~ rowsum()), 
    NA_column = columns that has NA in that row
  )

完整实现代码

library(dplyr)
library(purrr)

df %>%
  rowwise() %>%
  mutate(
    # 统计每行有效值数量(中间变量)
    valid_count = sum(!is.na(c(x, y, z))),
    # 生成value列
    value = case_when(
      valid_count == 3 ~ sum(x, y, z, na.rm = TRUE),
      valid_count >= 2 ~ max(x, y, z, na.rm = TRUE) * 1.2,
      valid_count == 1 ~ sum(x, y, z, na.rm = TRUE),
      TRUE ~ NA_real_
    ),
    # 生成NA_column列,收集有NA的列名并拼接
    NA_column = paste(names(.)[is.na(c(x, y, z))], collapse = ", ")
  ) %>%
  ungroup() %>%
  select(-valid_count) # 移除中间变量

代码逻辑说明

  1. 用rowwise()开启逐行处理模式,确保后续计算针对单行执行
  2. valid_count统计每行有效值数量,作为分支判断依据
  3. value列通过case_when分三种场景处理:
    • 无NA时直接求和
    • 多列有效但存在NA时取最大值乘1.2
    • 仅一列有效时直接取该有效值(sum加na.rm=TRUE自动忽略NA)
  4. NA_column通过筛选当前行值为NA的列名,用paste拼接成字符串
  5. 最后取消逐行模式并移除中间变量

内容的提问来源于stack exchange,提问作者HoelR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 14:36:19