R语言如何按行将特定值d之后的所有元素转换为NA
问题需求
假设有如下数据框:
# ID v1 v2 v3 v4 #1 H 0 0 d 0 #2 I 0 0 0 0 #3 J d 0 0 0 #4 K 0 0 0 d #5 L 0 d 0 0
已知规则:每行最多包含1个d值,不存在一行多个d的情况。
现在需要对每行做如下处理:找到该行d出现的位置,将该位置之后的所有元素全部替换为NA,预期输出结果如下:
# ID v1 v2 v3 v4 #1 H 0 0 d NA #2 I 0 0 0 0 #3 J d NA NA NA #4 K 0 0 0 d #5 L 0 d NA NA
测试数据
你可以直接用以下代码生成测试用的数据框:
df <- data.frame(ID = LETTERS[8:12], v1 = c(0, 0, 'd', 0, 0), v2 = c(0, 0, 0, 0, 'd'), v3 = c('d', 0, 0, 0, 0), v4 = c(0, 0, 0, 'd', 0), stringsAsFactors = FALSE)
实现方案
基础R方案
按行遍历判断d的位置,对后续位置赋值为NA即可:
df[] <- t(apply(df, 1, function(row) { d_idx <- which(row == "d") # 只有当前行存在d的时候才做替换 if (length(d_idx) > 0) { row[(d_idx + 1):length(row)] <- NA } return(row) }))
tidyverse方案
如果习惯用dplyr语法,可以用行遍历+列位置判断实现:
library(dplyr) df <- df %>% rowwise() %>% mutate( # 找到d所在的列序号 d_pos = which(c_across(everything()) == "d")[1] ) %>% ungroup() %>% # 逐列判断是否在d的位置之后,是则替换为NA mutate(across(2:ncol(.), ~ifelse(cur_column() > d_pos, NA, .))) %>% select(-d_pos)
内容的提问来源于stack exchange,提问作者Sotos
相关产品推荐
相关产品推荐

