如何识别 R 中 data.frame 中的重复数据?
How to identify duplicated data in a data.frame in R?
我有一个 data.frame - 例如:data1.csv - (100 000 行 x 5 列)。
N - ID - 日期 - 文本 - 语言
接下来我做了一个没有set.seed
的3000的样本:
num <- c(1:100000)
aleat <- sort(sample(num, 3000, replace = F))
data2 <- data1[aleat,c(1,4)]
注意上校。 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 相关联。保持秩序必不可少。
请注意,文本语言为西班牙语。包括不同的口音。当我阅读这两个文件时,我使用 fread
函数。对于数据 1,我对数据 2 使用 UTF-8 encoding
和 Latin-1
。如果我用 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的行号。这种方法不起作用。它识别 2400 of 3000 并且顺序不正确。我认为这是因为剩下的 600 个是交错的。
我想你正在寻找的是一个连接。试试这个:
library(dplyr)
data2 %>%
left_join(data1 %>% select(-N), by = "TEXT")
但是,通过包含使用不同编码处理和读取的特殊字符的文本字段进行连接可能会导致问题。如果可能的话,我建议您在使用其他程序处理这些示例数据时保留一个唯一 ID,并改用此列加入。
我有一个 data.frame - 例如:data1.csv - (100 000 行 x 5 列)。
N - ID - 日期 - 文本 - 语言
接下来我做了一个没有set.seed
的3000的样本:
num <- c(1:100000)
aleat <- sort(sample(num, 3000, replace = F))
data2 <- data1[aleat,c(1,4)]
注意上校。 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 相关联。保持秩序必不可少。
请注意,文本语言为西班牙语。包括不同的口音。当我阅读这两个文件时,我使用 fread
函数。对于数据 1,我对数据 2 使用 UTF-8 encoding
和 Latin-1
。如果我用 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的行号。这种方法不起作用。它识别 2400 of 3000 并且顺序不正确。我认为这是因为剩下的 600 个是交错的。
我想你正在寻找的是一个连接。试试这个:
library(dplyr)
data2 %>%
left_join(data1 %>% select(-N), by = "TEXT")
但是,通过包含使用不同编码处理和读取的特殊字符的文本字段进行连接可能会导致问题。如果可能的话,我建议您在使用其他程序处理这些示例数据时保留一个唯一 ID,并改用此列加入。