R语言实现按指定行数值条件筛选数据框列的方法
R实现数据框按行条件列筛选方案
原始数据构造
首先将示例数据读取为R中的数据框,行名对应A/B/C/D四个分组:
df <- data.frame( row.names = c("A", "B", "C", "D"), C1 = c(5, 3, 2, 10), C2 = c(7, 7, 5, 4), C3 = c(10, 12, 20, 18), C4 = c(1, 2, 2, 5), c5 = c(3, 10, 5, 7), C6 = c(2, 5, 5, 4), C7 = c(14, 8, 8, 18), C8 = c(2, 3, 10, 19) )
需求1实现:保留D行值小于同列A/B/C任意一行值的列
判断逻辑:逐列遍历,只要同列A、B、C三行中存在任意一个值大于D行取值,就保留该列。
# 逐列生成保留标记 keep_logic1 <- apply(df, MARGIN = 2, FUN = function(col_val) { d_v <- col_val[["D"]] any(col_val[c("A", "B", "C")] > d_v) }) # 输出筛选结果 result1 <- df[, keep_logic1]
运行print(result1)得到的输出和预期完全一致:
C2 C3 c5 C6 A 7 10 3 2 B 7 12 10 5 C 5 20 5 5 D 4 18 7 4
需求2实现:保留D行值同时小于同列B行、C行值的列
判断逻辑:逐列遍历,只有当同列B行、C行的取值都大于D行取值时,才保留该列。
# 逐列生成保留标记 keep_logic2 <- apply(df, MARGIN = 2, FUN = function(col_val) { d_v <- col_val[["D"]] col_val[["B"]] > d_v & col_val[["C"]] > d_v }) # 输出筛选结果 result2 <- df[, keep_logic2]
运行print(result2)最终得到符合条件的列为C2、C6,结果如下:
C2 C6 A 7 2 B 7 5 C 5 5 D 4 4
内容的提问来源于stack exchange,提问作者Reda
相关产品推荐
相关产品推荐

