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

使用across()函数过滤无跨列重复数字的DataFrame行

问题描述

给定如下R DataFrame:

df <- data.frame(
  Var1 = c("1  2  3","1  6","2  5  9","1  5  3"),
  Var2 = c("1  2","1  6  0  5","3  7","1  5"),
  Var3 = c("2  8","1  3","6  19","1  3")
)

其表格形式为:

Var1Var2Var3
1 2 31 22 8
1 61 6 0 51 3
2 5 93 76 19
1 5 31 51 3

需求为:保留所有行中无跨列重复数字的记录——即若某行内任意数字出现在至少两列中,则删除该行。预期结果如下:

Var1   Var2    Var3
3 2  5  9   3  7  6  19

要求:因后续DataFrame列数会增加,需使用across()函数实现该过滤逻辑。

解决方案

使用dplyr结合stringr包实现,代码如下:

library(dplyr)
library(stringr)

# 过滤无跨列重复数字的行
df_filtered <- df %>%
  rowwise() %>%
  filter(
    # 对所有列拆分字符串为数字,合并后检查去重前后长度一致
    length(unique(unlist(across(everything(), ~ str_split(.x, "\\s+") %>% unlist() %>% as.numeric())))) == 
    length(unlist(across(everything(), ~ str_split(.x, "\\s+") %>% unlist() %>% as.numeric())))
  ) %>%
  ungroup()

# 输出结果
print(df_filtered)

逻辑说明

  1. rowwise():将数据切换为按行处理模式,确保每一行单独计算
  2. across(everything(), ...):对所有列统一执行后续操作,适配列数动态增加的场景
  3. str_split(.x, "\\s+"):按任意数量的空白字符拆分字符串,得到数字字符组成的列表
  4. unlist() %>% as.numeric():将拆分后的列表转为数值向量,方便后续去重检查
  5. 比较去重前后的数字总长度:若长度相等,说明该行所有数字仅出现一次(无跨列重复),保留该行;否则删除

运行代码后,即可得到符合要求的过滤结果。

内容的提问来源于stack exchange,提问作者Rgrvkfer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:25:06