В R сопоставьте данные из строковой переменной в двух фреймах данных, а когда совпадение найдено, объедините соответствующие строки - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть два фрейма данных df1 (4x4) и df2 (4x1).В каждой первой переменной (т. Е. Original_items и Reordered) является строка.В df1 V2: V4 являются числовыми.Вы можете видеть, что в df1 и df2 данные в первой переменной расположены в другом порядке.Мне нужно сделать следующее.

Возьмите 1-й элемент переменной df2 'Reordered' (т. Е. Наслаждайтесь праздниками.), Затем найдите элементы переменной df1 'Original_items', чтобы найти точное совпадение.

Когда совпадение найдено, мне нужно взять всю строку данных, связанных с соответствующим элементом, в df1 'Original_items' (т. Е. "Наслаждайтесь праздниками.", 4,1,3) и добавить его рядом стот же элемент переменной df2 'Reordered' (т. е. "Наслаждайтесь праздниками").Мне нужен этот вывод в новом фрейме данных, названном df_desired, который должен быть: «Наслаждайся праздниками», «Наслаждайся праздниками», 4, 1, 3.Пожалуйста, смотрите ниже иллюстрацию этого примера.

Когда это будет сделано, я бы хотел повторить этот процесс для каждого элемента переменной df2 'Reordered', поэтому окончательный результат выглядит как таблица df_desired ниже.

Контекст проблемы.У меня есть около 2000 элементов и 1000 точек данных, связанных с каждым элементом.Поскольку мне нужно сопоставлять элементы и добавлять данные заранее определенным способом, я пытаюсь найти эффективное решение.

РЕДАКТИРОВАТЬ Было предложено просто переименовать элементы в «Оригинал».Переменная».Хотя это и правда, неудобно делать для фрейма данных более 2000 элементов.

Также было упомянуто, что этот вопрос может быть связан только со слиянием.Я считаю, что объединение необходимо здесь только для элементов, которые были идентифицированы как идентичные в df1 и df2.Следовательно, есть два ключевых вопроса: 1) как сопоставить строковые переменные в данном конкретном случае?2) как объединить / добавить строки условно, т.е. если они были сопоставлены.Спасибо за ваш вклад, и я был бы признателен за вашу помощь, пожалуйста

Я упомяну, что я пытался и выяснил до сих пор.Я понял,

 df1[,1] == df2 [,1] # gives me true or false if rows in column 1 are the 
                       same in both data frames. I tried to set up a double loop, but unsuccessfully   
 for (i in 1:nrow(df1)) {                                                 
      for (j in 1:nrow(df2)){
    if (i==j){
         c <- merge(a,b)        
        } else 
              print("no result")
           }
                 }  

Я чувствую, что в цикле я не могу указать, что я работаю только со значениями строки из одной переменной "Original_item" в df1

# df1 (4x4 matrix)
  Original_items        V2    V3   V4
  Love birds.            1     5    3
  Eat a lot of food.     2     5    5
  Love birthdays.        2     2    4
  Enjoy holidays.        4     1    3

# df2  (4x1 matrix)
  Reordered                   
  Enjoy holidays. 
  Eat a lot of food.
  Love birds. 
  Love birthdays.      

# df_desired (4x5 matrix)
  Reordered             Original_items            V2   V3   V4    
  Enjoy holidays.       Enjoy holidays.           4     1    3
  Eat a lot of food.    Eat a lot of food.        2     5    5 
  Love birds.           Love birds.               1     5    3
  Love birthdays.       Love birthdays.           2     2    4

1 Ответ

1 голос
/ 13 апреля 2019

Если я правильно понимаю, вы сначала хотите отсортировать df1$original_items в том же порядке, что и порядок df2, а затем применить тот же шаблон сортировки к остальным df1 переменным. Сначала получите ваш вектор индексов df1 в последовательном порядке, в котором вы хотите, чтобы эти строки df1 оканчивались.

#initialize an object to capture the above output
indices <- NULL
for (i in 1:nrow(df1)) {
    indices[i] <- which(df1$Original_items == df2$Reordered[i]))
}

Затем просто используйте этот список индексов, чтобы переупорядочить все строки df1 и создать новый df.

df_desired <- cbind(df2$Reordered, df1[indices, ])
...