如何用R的dplyr包mutate/across生成首个大于date的entry列
用dplyr实现提取首个大于date的t列值
完整解决方案代码
library(dplyr) library(purrr) # 原数据集 df <- data.frame("id" = c(1,2,3,4), "date" = c(4,8,2,5), "t_1" = c(NA,9,NA,4), "t_2" = c(NA,10,NA,5), "t_3" = c(NA,12,NA,6),"t_4" = c(NA,16,NA,8)) # 生成entry列的处理逻辑 df <- df %>% rowwise() %>% mutate(entry = { # 提取当前行所有t_开头的列值 t_values <- c_across(starts_with("t_")) # 筛选大于date的元素,取第一个;无符合值则返回NA first(t_values[t_values > date], default = NA) }) %>% ungroup()
关键步骤解释
rowwise():将数据框转为按行分组,确保后续操作逐行独立执行c_across(starts_with("t_")):动态提取所有以t_开头的列,生成每行的t值向量,适配任意数量的t_x列first(t_values[t_values > date], default = NA):筛选出大于当前行date的t值,取第一个符合条件的结果;如果所有t值≤date或全为NA,则返回NAungroup():取消行分组,恢复数据框默认状态,避免影响后续操作
结果验证
运行代码后,df的entry列将与期望结果完全一致:c(NA,9,NA,6),符合题目要求。
内容的提问来源于stack exchange,提问作者KateS
相关产品推荐
相关产品推荐

