【问题标题】:How to identify duplicated data in a data.frame in R?如何识别R中data.frame中的重复数据?
【发布时间】:2026-02-03 02:15:01
【问题描述】:

我有一个 data.frame - 例如:data1.csv -(100 000 行 x 5 列)。

N - ID - DATE - TEXT - LANG

接下来,我做了一个没有set.seed的3000个样本:

num <- c(1:100000)
aleat <- sort(sample(num, 3000, replace = F))
data2 <- data1[aleat,c(1,4)]

请注意,col。 4是文本。

data2.csv 已被其他程序处理并向文件添加变量。
现在,data2 是一个 data.frame(3000 行 x 3 列)

N - 文本 - 代码

data2$N = c(1:3000) 所以data1$N不同于data2$N

现在,我需要识别 data1 中的那 3000 个 TEXT (data2),以便将它们与我最初不需要的所有原始变量相关联。我需要将 ID 与 TEXT 和 CODE 相关联。保持秩序至关重要。

请注意,文本语言是西班牙语。包括不同的口音。当我阅读这两个文件时,我使用freadfunction。对于data1,我使用UTF-8 encodingLatin-1for data2。如果我用UTF-8 encoding 读取data2,R 就不会正确读取它。我想是因为另一个程序已经处理并保存了它。

我尝试了两种方法:

1) for 循环:

try1 <- matrix(0, nrow=3000, ncol= 5)
for (i in (1:3000)){
  for (j in (1:100000)){
    if ((data2[i,2] == data1[j,4]) == T){
      try1[j,] <- data1[j,]
    }
  }
}

#OR  

gg <- NULL
a <- NULL
for (j in 1:100000) {
  for (i in 1:3000) {
    if((data2[i,2]==data1[j,4]==T))
      a <- data1[j,]
    gg <- c(gg,a)
  }
}

两个循环都失败了。我运行它们时没有错误,但运行循环后 Try1 或 gg 仍然为空。

2) duplicated 函数。

num <- c(1:103000)
text1 <- as.data.frame(data1[,4]); colnames(text1) <- "TEXT"
text2 <- as.data.frame(data2[,2]); colnames(text2) <- "TEXT"
text <- rbind(text1,text2)
data3 <- as.data.frame(cbind(num,text))
dup <- as.data.frame(data3[duplicated(data3$TEXT),])

我创建变量num 以识别data1 的行号。这种方法行不通。它识别出 3000 个中的 2400 个,并且顺序不正确。我认为这是因为剩下的 600 个是交错的。

【问题讨论】:

  • Juan,由于我们没有您的数据,我们无法测试您的代码。请在您的问题中添加小而有代表性的数据。由于帧相当大,最好只包含每个帧的几列/行 (dput(x[1:5,1:5])) 或创建假数据 (data.frame(...)) 以便我们可以看到您的代码是如何工作的。顺便说一句:链接比较 (data2[i,2]==data1[j,4]==T) 在 python (geeksforgeeks.org/chaining-comparison-operators-python) 中有效,但在 R 中无效;此外,cond == T 的任何条件都可以省略 ==T 而只执行 cond

标签: r dataframe text duplicates identify


【解决方案1】:

我认为您正在寻找的是加入。试试这个:

library(dplyr)
data2 %>%
  left_join(data1 %>% select(-N), by = "TEXT")

但是,通过包含已使用不同编码处理和读取的特殊字符的文本字段进行连接可能会导致问题。如果可能的话,我建议您在使用其他程序处理这些示例数据时保留唯一 ID,并改为通过此列加入。

【讨论】: