Для l oop сравнения значений 2 фреймов данных, помещающих выходные результаты теста в 3-й фрейм данных в R - PullRequest
0 голосов
/ 25 мая 2020

Я хочу сравнить 2 фрейма данных в R, если их значения точно такие же. Этакий тест. Если значение df1 (row1, column1) == полностью совпадает со значением df2 (row1, column1), оно должно вернуть «OK» в той же позиции в пустом 3-м фрейме данных (row1, column1), который я хочу заполнить с выходными тестовыми результатами сравнения. В противном случае он должен вернуть «ПРОБЛЕМА» в этой позиции. Второй итерацией будет позиция 2, позиция 3 и так далее до тех пор, пока тест не пройдет через значения df1 и df 2. -> df1 и df2 имеют одинаковое количество столбцов и одинаковое количество строк (150 строк и 6 столбцов), df3 пуст и должен быть заполнен результатами вывода.

Я новичок в циклах for и много страдаю от проб и ошибок. Пока я пробовал это: в качестве тестовых данных я использовал набор данных Iris. Фреймы данных Iris1 и Iris2 должны быть одинаковыми. Чтобы проверить, работает ли my for l oop, я вручную изменил 2 случайных значения в Iris2. Iris3 - это пустой фрейм данных, который я хочу заполнить выходными результатами теста. Как видите, сейчас я пытаюсь использовать простую функцию печати, но это тоже не работает, и это не то, что я хочу здесь делать. Я хочу, чтобы вывод сохранялся в df3. Надеюсь, кто-нибудь сможет мне помочь. Заранее спасибо!

Iris3 <- Iris1[FALSE,]

  for (i in 1:(length(Iris1))) {
for(j in 1:(length(Iris2))) {
    if(Iris1[[i]] == Iris2[[i]]) {
      print("OK")
    }
    else print("PROBLEM")
}}

1 Ответ

0 голосов
/ 25 мая 2020

Нет необходимости в al oop. Вы можете просто сравнить Iris1 == Iris2 и использовать результат для получения значений из вектора.

Iris1 <- Iris2 <- Iris3 <- iris

Iris2[1,1] <- 0
Iris2[2,2] <- 0

Iris3[] <- c("PROBLEM", "OK")[1+(Iris1 == Iris2)]

head(Iris3)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1      PROBLEM          OK           OK          OK      OK
#2           OK     PROBLEM           OK          OK      OK
#3           OK          OK           OK          OK      OK
#4           OK          OK           OK          OK      OK
#5           OK          OK           OK          OK      OK
#6           OK          OK           OK          OK      OK

Если вы хотите использовать a для l oop:

for(i in seq_along(Iris1)) {
  Iris3[i] <- ifelse(Iris1[i] == Iris2[i], "OK", "PROBLEM")
}
...