基于条件逻辑为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) # 移除中间变量
代码逻辑说明
- 用
rowwise()开启逐行处理模式,确保后续计算针对单行执行 valid_count统计每行有效值数量,作为分支判断依据value列通过case_when分三种场景处理:- 无NA时直接求和
- 多列有效但存在NA时取最大值乘1.2
- 仅一列有效时直接取该有效值(sum加
na.rm=TRUE自动忽略NA)
NA_column通过筛选当前行值为NA的列名,用paste拼接成字符串- 最后取消逐行模式并移除中间变量
内容的提问来源于stack exchange,提问作者HoelR
相关产品推荐
相关产品推荐

