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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 16:25:32