R语言如何创建仅含特定列独有观测的data.frame
R语言筛选特定列独有观测的实现方案
判定规则说明
- 预先排除仅做行标识的非数值列(如示例中的
column列) - 校验目标列:所有指定的目标列取值需大于0
- 校验非目标列:其余参与数值判断的列,取值必须全部等于0
基础R实现
复现示例数据
df <- data.frame( column = c("Obs1", "Obs2", "Obs3", "Obs4", "Obs5"), `1` = c(1,2,0,0,1), `2` = c(0,0,0,0,2), `3` = c(0,0,1,0,3), `4` = c(0,0,1,3,4), check.names = FALSE )
需求1:筛选1列>0,2/3/4列全为0的行
用rowSums统计非目标列中取值为0的列数,当统计值与非目标列总列数相等时,即满足全0要求。
S1_unique <- df[ df[[`1`]] > 0 & rowSums(df[, c(`2`, `3`, `4`)] == 0) == ncol(df[, c(`2`, `3`, `4`)]), ] S1_unique
运行结果仅包含Obs1、Obs2,与预期一致。
需求2:筛选3/4列均>0,1/2列全为0的行
S34_unique <- df[ df[[`3`]] > 0 & df[[`4`]] > 0 & rowSums(df[, c(`1`, `2`)] == 0) == ncol(df[, c(`1`, `2`)]), ] S34_unique
运行结果仅包含Obs3,与预期一致。
dplyr 实现
用if_all可直接给指定列组加统一判断规则,代码可读性更高,不容易因手动数列出错。
library(dplyr) # 需求1实现 S1_unique_dplyr <- df %>% filter( `1` > 0, if_all(c(`2`, `3`, `4`), ~. == 0) ) # 需求2实现 S34_unique_dplyr <- df %>% filter( `3` > 0, `4` > 0, if_all(c(`1`, `2`), ~. == 0) )
注意:示例中数值列名为纯数字,代码引用时必须用反引号包裹,否则R会将数字识别为索引而非列名,触发报错。
内容的提问来源于stack exchange,提问作者Ecg
相关产品推荐
相关产品推荐

