Невозможно обновить данные в фрейме данных - PullRequest
0 голосов
/ 02 мая 2018

я попытался обновить данные в фрейме, но не удалось получить обновление

// Инициализировать данные и фрейм данных здесь

    user_data=read.csv("train_5.csv")
    baskets.df=data.frame(Sequence=character(),
                          Challenge=character(), 
                          countno=integer(), 
                          stringsAsFactors=FALSE) 

/ Обновление данных в фрейме данных здесь

for(i in 1:length((user_data)))
{
  for(j in i:length(user_data))
  {
    if(user_data$challenge_sequence[i]==user_data$challenge_sequence[j]&&user_data$challenge[i]==user_data$challenge[j])
    {
     writedata(user_data$challenge_sequence[i],user_data$challenge[i])

    }

  }

}
writedata=function( seqnn,challng)
{

  #print(seqnn)
  #print(challng)
  newRow <- data.frame(Sequence=seqnn,Challenge=challng,countno=1)
  baskets.df=rbind(baskets.df,newRow)

}

// посмотреть данные здесь

View(baskets.df)

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

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

Имея это в виду, вот то, что, я считаю, будет намного более быстрой реализацией вашего кода

user_data=read.csv("train_5.csv")

# challenge_indices will be a matrix with TRUE at every place "challenge" and "challenge_sequence" is the same
challenge_indices <- outer(user_data$challenge_sequence, user_data$challenge_sequence, "==") &
  outer(user_data$challenge, user_data$challenge, "==")

# since you don't want duplicates, get rid of them
challenge_indices[upper.tri(challenge_indices, diag = TRUE)] <- FALSE

# now let's get the indices of interest
index_list <- which(challenge_indices,arr.ind = TRUE)

# now we make the resulting data set all at once
# this is much faster, because it does not require copying the data frame many times - which would be required if you created a new row every time.
baskets.df <- with(user_data, data.frame(
  Sequence = challenge_sequence[index_list[,"row"]],
  challenge = challenge[index_list[,"row"]]
)
0 голосов
/ 02 мая 2018

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

Ваша функция writedata была написана, чтобы быть немного свободной с ее областью действия. Когда вы создаете новую функцию, то, что происходит в ней, технически происходит в ее собственной среде . То есть он пытается искать вещи, определенные в функции, а затем любые новые объекты, которые он создает, создаются только в этой среде. R также имеет эту замечательную (и иногда хитрую) функцию, которая, если он не может найти объект в среде, попытается найти родительскую среду.

Влияние, которое это оказывает на вашу функцию writedata, заключается в том, что когда R ищет в функции baskets.df и не может ее найти, R затем поворачивается к Глобальной среде, находит там baskets.df и затем использует ее. в rbind. Однако результат rbind сохраняется в baskets.df в среде function и не обновляет объект с тем же именем в глобальной среде.

Для решения этой проблемы я добавил аргумент к writedata, который просто называется data. Затем мы можем использовать этот аргумент для передачи фрейма данных в среду функции и делать все локально. Не делая никаких присваиваний в конце, мы неявно сообщаем функции, чтобы она возвращала свой результат.

Затем в вашем цикле вместо простого вызова writedata мы присваиваем его результат обратно baskets.df для замены предыдущего результата.

for(i in 1:length((user_data)))
{
  for(j in i:length(user_data))
  {
    if(user_data$challenge_sequence[i] == user_data$challenge_sequence[j] && 
       user_data$challenge[i] == user_data$challenge[j])
    {
     baskets.df <- writedata(baskets.df, 
                             user_data$challenge_sequence[i],
                             user_data$challenge[i])

    }

  }

}


writedata=function(data, seqnn,challng)
{

  #print(seqnn)
  #print(challng)
  newRow <- data.frame(Sequence = seqnn,
                       Challenge = challng,
                       countno = 1)
  rbind(data, newRow)

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...