Как идентифицировать повторяющиеся данные в data.frame в R?

У меня есть data.frame - например: data1.csv - (100 000 строк x 5 столбцов).

N - ID - ДАТА - ТЕКСТ - ЯЗЫК

Далее я сделал выборку из 3000 без set.seed:

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

Теперь мне нужно идентифицировать эти 3000 TEXT (data2) в data1, чтобы связать их со всеми исходными переменными, которые мне сначала не нужны. Мне нужно связать ID с TEXT и CODE. Соблюдать порядок — это важно.

Обратите внимание, что язык текста — испанский. Включены разные акценты. Когда я читаю оба файла, я использую freadfunction. Для данных1 я использую UTF-8 encodingи Latin-1для данных2. Если я читаю data2 с помощью UTF-8 encoding, R не читает это правильно. Я полагаю, это потому, что другая программа обработала и сохранила его.

Я пробовал два способа:

1) для петель:

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 из 3000, и порядок неправильный. Я думаю, это потому, что оставшиеся 600 чередуются.


person Juan Antonio Guevara Gil    schedule 27.06.2019    source источник
comment
Хуан, поскольку у нас нет ваших данных, мы не можем протестировать ваш код. Пожалуйста, добавьте к своему вопросу небольшие репрезентативные данные. Поскольку фреймы довольно большие, может быть лучше включить всего несколько столбцов/строк каждого (dput(x[1:5,1:5])) или создать поддельные данные (data.frame(...)), чтобы мы могли видеть, как работает ваш код. Кстати: сравнение цепочек (data2[i,2]==data1[j,4]==T) работает в python (geeksforgeeks.org/chaining-comparison- операторы-python), но не в R; кроме того, любое условие cond == T может опустить ==T и просто сделать cond.   -  person r2evans    schedule 28.06.2019


Ответы (1)


Я думаю, что вы ищете соединение. Попробуй это:

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

Однако объединение по текстовому полю, содержащему специальные символы, которые были обработаны и прочитаны с использованием разных кодировок, может привести к проблемам. Если возможно, я бы предложил вам сохранить уникальный идентификатор при обработке этих образцов данных с другими программами и вместо этого присоединиться к этому столбцу.

person eastclintw00d    schedule 27.06.2019
comment
Я счастлив, что смог помочь вам. Пожалуйста, примите мой ответ. - person eastclintw00d; 28.06.2019