Хобрук: Ваш путь к мастерству в программировании

сравнить более 3 переменных внутри, если

я использую R для выполнения некоторых вычислений, но мне было интересно, можно ли сделать оператор if с 3 переменными.

Например:

for(d3 in unique(df2$V1))
    {
        for(d1 in 1:nrow(df1))
        {   
            for(d2 in 1:nrow(df2))
            {   
                if(df1[d1,]$V1 == df2[d2,]$V2 == d3)
                                    {

                oneV1 = subset(df2, V1==d3)
                minerrV2 =subset(oneV1,erV2==min(V2))       
                minerrV3 =subset(oneV1, erV3==min(V3))

                cverV2 = sum(df1$erV2 <= minerrV2$erV2)
                cverV3 = sum(df1$erV3 <= minerrV3$erV3)

                pV2 = cverV2/nrow(df1)
                pV3 = cverV3/nrow(df1)


    fres <- rbind(fres, data.frame(nV1=df1[d1,]$V1, nV4=df2[d2,]$V4, npV2=pV2,npV3=pV3 ))
                                     }
                         }
                }
        }

есть ли простой способ сделать это в R, кроме как делать много операторов if ??

**EDIT**

Это какой-то тест перестановки со специальными параметрами.. можно ли это сделать с помощью слияния и быстрее, чем циклы for ???

r
19.11.2012

  • Вы можете сделать это, используя логику (& и |). Или используя all.equal(). 19.11.2012
  • А вложенный for скорее всего не нужен. Пожалуйста, сделайте ваш пример воспроизводимым. 19.11.2012
  • хорошо, поэтому я думаю, что то, что я хочу сделать, не может быть сделано в R, так как в python 3 equals одновременно ... но я могу сделать работу, о которой я уже знал (логика) .. спасибо 19.11.2012
  • Что именно вы хотите сделать, не ясно, но это, безусловно, можно сделать, но, возможно, не так, как вы ожидаете. Опять же, без воспроизводимого примера мы не можем больше помочь. Если вы хотите объединить много логических выражений, посмотрите на any и all. 19.11.2012
  • @Justin, обычно предпочтительнее использовать && и || внутри операторов if. 19.11.2012

Ответы:


1
  • Должны ли df2$V1, df2$V2 и df1$V1 быть факторами, позволяющими избежать "ошибок" из-за ошибок округления при сравнении?

  • для численного сравнения более двух переменных см. ? all.equal

    for(d3 in unique(df2$V1)) {
       tmp1 <- df1 [df1$V1 == d3,]
       tmp2 <- df2 [df2$V3 == d3,]
       outer (tmp1$x, tmp2$y, do.something) 
       ## OR:
       tmp1 <- which (df1$V1 == d3)
       tmp2 <- which (df2$V3 == d3)
       outer (tmp1, tmp2, do.something) 
    }
    

Какой из этих подходов или подход Али, или ?tappy, ? aggregate, ? split и ? mapply, или ... лучше, зависит от вашего do.something

19.11.2012

2

В дополнение к приведенным выше комментариям Джастина и других, вы можете избежать использования циклов for и условий if, выполнив что-то вроде этого:

bar = df2[! duplicated(df2$V1), ]
foo = merge(df1, df2, by.x = "V1", by.y = "V2", incomparables = NA)
foo = merger(foo, bar, by="V1", incomparables=NA)
for (i in seq(nrow(foo))) {
    ...
}

Я думаю, что для больших таблиц этот метод был бы намного эффективнее, поскольку он позволяет избежать сравнения каждой строки df1 и df2.

19.11.2012
  • я думаю, что это невозможно сделать, потому что кадры данных имеют разное количество строк.. 19.11.2012
  • @ifreak Это возможно, потому что merge() не нужны таблицы с одинаковым количеством строк. См. ?merge 19.11.2012
  • да, вы правы, но если я их объединим, я не смогу сравнивать значения внутри if... что я хочу сделать внутри if, так это найти равные значения V1, а затем проверить другие переменные между двумя фреймами данных. если я их объединил, я не смогу этого сделать, или ?? 20.11.2012
  • Если две строки двух таблиц объединены в одну строку, это означает, что V1 значение df1 было равно V2 значению df2. Так что вам не нужно дополнительное, если проверить это. 20.11.2012
  • ,, я обновлю свой вопрос и добавлю, что мне нужно сделать, и, пожалуйста, скажите мне, можно ли это сделать с помощью слияния и как ... потому что я никогда не использовал его раньше, и я не так много понимаю ... 20.11.2012
  • @ifreak просто думайте как foo = merge(df1, df2, by.x = "V1", by.y = "V2", incomparables = NA) как о data.frame, который уже прошел df1$V1==df2$V2$ в каждой строке, и попробуйте перебрать его строки и сделать свои условия и назначения на его основе. Если вы не можете понять merge(), просто посмотрите, что у вас есть в вашем data.frame после команды merge(). Начните с нескольких частей ваших данных. Я уверен, что вы можете найти свое решение. 20.11.2012
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..