在R tidyverse中基于其他列值创建新列的实现方案
使用Tidyverse生成指定规则的
output_column 需求
基于现有tibble数据框创建output_column,规则如下:
- 取每行最右侧的非空列的值
- 若该行存在任何NA列,在值后追加
_NA;若所有列均非空,则直接取值
示例数据
library(tidyverse) test_df <- tibble(kingdom = rep("bacteria",6), phylum = c(NA, "sterp", rep("entro", 4)), class = c(rep(NA, 2), rep("abc",4)), order= c(rep(NA,3), rep("cde", 3)), family= c(rep(NA,4), rep("xyz", 2)), genus= c(rep(NA,5), "sam"))
解决方案
test_df <- test_df %>% rowwise() %>% mutate( # 提取每行最后一个非空值 last_val = last(na.omit(c_across(kingdom:genus))), # 判断该行是否包含NA has_missing = any(is.na(c_across(kingdom:genus))), # 生成目标列 output_column = if_else(has_missing, str_c(last_val, "_NA"), last_val) ) %>% ungroup()
代码解释
rowwise():开启按行处理模式c_across(kingdom:genus):将每行指定范围内的列转为向量last(na.omit(...)):过滤NA后取最后一个元素,即最右侧非空值any(is.na(...)):检查该行是否存在缺失值if_else():根据是否存在缺失值拼接结果
运行后结果与预期一致:
# A tibble: 6 × 8 kingdom phylum class order family genus last_val has_missing output_column <chr> <chr> <chr> <chr> <chr> <chr> <chr> <lgl> <chr> 1 bacteria NA NA NA NA NA bacteria TRUE bacteria_NA 2 bacteria sterp NA NA NA NA sterp TRUE sterp_NA 3 bacteria entro abc NA NA NA abc TRUE abc_NA 4 bacteria entro abc cde NA NA cde TRUE cde_NA 5 bacteria entro abc cde xyz NA xyz TRUE xyz_NA 6 bacteria entro abc cde xyz sam sam FALSE sam
内容的提问来源于stack exchange,提问作者Hamideh
相关产品推荐
相关产品推荐

