使用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") )
其表格形式为:
| Var1 | Var2 | Var3 |
|---|---|---|
| 1 2 3 | 1 2 | 2 8 |
| 1 6 | 1 6 0 5 | 1 3 |
| 2 5 9 | 3 7 | 6 19 |
| 1 5 3 | 1 5 | 1 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)
逻辑说明
rowwise():将数据切换为按行处理模式,确保每一行单独计算across(everything(), ...):对所有列统一执行后续操作,适配列数动态增加的场景str_split(.x, "\\s+"):按任意数量的空白字符拆分字符串,得到数字字符组成的列表unlist() %>% as.numeric():将拆分后的列表转为数值向量,方便后续去重检查- 比较去重前后的数字总长度:若长度相等,说明该行所有数字仅出现一次(无跨列重复),保留该行;否则删除
运行代码后,即可得到符合要求的过滤结果。
内容的提问来源于stack exchange,提问作者Rgrvkfer
相关产品推荐
相关产品推荐

