如何删除数据框内同一行字符串变量取值相同的行?优先tidyverse方案
R语言删除同一行所有字符串列取值相同行的实现方案
需求说明
需要删除数据框中同一行内所有字符串类型变量取值完全相同的行,示例数据如下:
data <- data.frame(c("A", "C", "B"), c("A", "B", "C"), stringsAsFactors = FALSE) head(data) # c..A....C....B.. c..A....B....C.. #1 A A #2 C B #3 B C
预期输出过滤掉第一行(两列均为A)的结果:
# c..A....C....B.. c..A....B....C.. #2 C B #3 B C
tidyverse实现方案(优先推荐)
核心逻辑是按行遍历,统计每行所有字符串类型列的唯一值数量,仅保留唯一值数量大于1的行:
library(dplyr) result <- data %>% # 开启按行处理模式 rowwise() %>% # 统计当前行所有字符型变量的唯一值数量,保留数量大于1的行 filter(n_distinct(c_across(where(is.character))) > 1) %>% # 取消行分组,避免后续操作受rowwise属性影响 ungroup()
如果不需要自动识别所有字符串列,只想针对指定列做判断,可以修改c_across的参数:
# 仅针对列col1、col2做判断的写法示例 result <- data %>% rowwise() %>% filter(n_distinct(c_across(c(col1, col2))) > 1) %>% ungroup()
适配提示:如果字符串列存在NA值,可在n_distinct中添加na.rm = TRUE参数适配场景
基础R实现方案(补充)
如果不想依赖第三方包,可以用基础R实现相同逻辑:
# 识别所有字符串类型列 char_cols <- sapply(data, is.character) # 过滤掉所有字符串列取值相同的行 result <- data[apply(data[, char_cols], 1, function(x) length(unique(x)) > 1), ]
内容的提问来源于stack exchange,提问作者choij
相关产品推荐
相关产品推荐

