R: как условно заменить строки во фрейме данных случайно выбранными строками из другого фрейма данных? - PullRequest
0 голосов
/ 25 марта 2019

Мне нужно условно заменить строки во фрейме данных (x) на строки, выбранные случайным образом из другого фрейма данных (y). Некоторые строки между двумя фреймами данных совпадают, и поэтому фрейм данных x будет содержать строки сповторная информация.Какой базовый код r мне понадобится для достижения этой цели?

Я пишу модель на основе агента в r, где строки можно рассматривать как векторы атрибутов, относящихся к агенту, а столбцы - это типы атрибутов.Чтобы агенты передавали свои атрибуты, им нужно отправлять строки из одного фрейма данных (совокупности) в другой, но в соответствии с правилами условного обучения.Эти правила должны быть: условно заменять значения в строке n во фрейме данных x, если атрибут в столбце 10 для этой строки имеет значение 1 или более, и если вероятность s больше случайно выбранного числа между 0 и 1. Вероятность s сама по себе являетсянастраиваемый параметр, который может принимать любое значение от 0 до 1.

Я попробовал функцию IF в приведенном ниже коде, но я новичок в r и где-то допустил ошибку, получив это предупреждение:

"пропущенное значение там, где необходимо ИСТИНА / ЛОЖЬ"

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

Я не могу придумать альтернативного метода достижения своей цели.

Примечание: agent.dat - это фрейм данных x, а top_ten_percent - это фрейм данных y.

s = 0.7
N = nrow(agent.dat)

copy <- runif(N)   #to generate a random probability for each row in agent.dat


    for (i in 1:nrow(agent.dat)){
        if(agent.dat[,10] >= 1 & copy < s){
            agent.dat <- top_ten_percent[sample(nrow(top_ten_percent), 1), ]
        }
    }

Фрейм данных agent.dat должен содержать строки, которые заменяются значениями из строк в фрейме данных top_ten_percent, если случайно выбранное значение копии от 0 до 1 для этой строки меньше значения параметраr s и если значение для этой строки в столбце 10 равно 1 или более.Для каждой строки мне нужно заменить первые 10 столбцов agent.dat на первые 10 столбцов top_ten_percent (исключая столбец 11, т.е. значение копирования).

Помощь в решении этой проблемы очень важна.

Ответы [ 2 ]

0 голосов
/ 25 марта 2019

Так что вам просто нужно изменить несколько вещей.

Вам нужно получить конкретное значение для copy для каждой итерации цикла for (используйте: copy[i]).

Вам также нужно сделать & в операторе if && ( логическими операторами && и || )

Затем вам нужно заменить определенную строку (и столбцы 1).через 10) в agent.dat вместо всего этого (agent.dat[i,1:10])

Итак, окончательный код должен выглядеть следующим образом:

  copy <- runif(N)

  for (i in 1:nrow(agent.dat)){
    if(agent.dat[,10] >= 1 && copy[i] < s){
      agent.dat[i,1:10] <- top_ten_percent[sample(nrow(top_ten_percent), 1), ]
    }
  }
0 голосов
/ 25 марта 2019

Это должно исправить ваши ошибки, если ваша структура данных соответствует вашему коду:

copy <- runif(nrow(agent.dat))

s <- 0.7

for (i in 1:nrow(agent.dat)){
        if(agent.dat[i,10] >= 1 & copy[i] < s){
            agent.dat[i,] <- top_ten_percent[sample(1:nrow(top_ten_percent), 1), ]
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...