Перебирайте уникальные значения подмножества df и обновляйте df новыми переменными - PullRequest
0 голосов
/ 23 октября 2018

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

У меня две цели:

  1. Объединить множество отдельных наборов данных в один,Переменная индекса - «SID» (идентификатор субъекта).
  2. Создание новых переменных / столбцов в этом основном наборе данных.

Прикрепленные данные являются примером того, что будет уже объединенный набор данныхпохоже, но содержит только 2 (SID: 9003 и 1028).

Мне нужно пройтись по каждому уникальному SID и выполнить несколько относительно простых вычислений для некоторых переменных в кадре данных, чтобы создать и добавить новыепеременные к нему.В каждом из этих столбцов PER SID должно быть уникальное значение.

В настоящее время я могу успешно сделать это для переменных, которые НЕ включают поднабор df.Например, переменные 'numPR', 'numDef' и 'numCoop' существуют так, как должны для каждого SID (когда я закомментирую часть цикла в Ingroup).Однако, когда я пытаюсь установить поднабор df и посмотреть только строки, в которых выполняется данное условие (я использую функцию подмножества), я получаю эту ошибку:

Ошибка в df $ numDef_IG [j] <- numDef_IG: длина замены равна нулю </p>

Дополнительно: предупреждающие сообщения:

1: In if (df $ numCoop [i] <1) {: условие имеет длину> 1 ибудет использоваться только первый элемент

2: в numDefCoop_IG [j] <- агрегат (x = numIG, by = list (unique.numValues ​​= numIG $ Player_move),: количество заменяемых элементов не являетсякратная длины замены </p>

Я чувствую, что это что-то с внутренним циклом for, который пытается получить доступ к подмножественным данным, и я также чувствую, что должно быть гораздо более элегантное решение, чем серия для-переходы для достижения этого. У меня есть еще несколько переменных / столбцов, которые закомментированы (начиная с ~ строки 86) для создания на основе также подмножеств df.

Любая помощь по этому вопросу будет принята с благодарностью.

данные: stackEx.csv

код:

#Loading data
file = "stackEx.csv"
df = read.csv(file, header = T)
numIG = subset(df, OppGroupCode == 1, select = c("SID", "Player_move"))
numDefCoop_IG = NA

for (sid in unique(df$SID)) { 
  i = df$SID == sid # create a logical index

  #Getting # of PRs in game per SID.
  numPR = sum(df$PreviewRound[i]) # subet the data based on the index
  df$numPR[i] = numPR # assign the values only to those selected rows

  #__Creating new variables and adding to dataset----

  #____Decisions, Overall----
   #_____ defections----
  numDef=sum(df$Player_move[i])
  df$numDef[i] = numDef

  #_____cooperations----
  numCoop=length(df$Player_move[i]) - df$numDef[i]
  df$numCoop[i] = numCoop

  if (df$numCoop[i] < 1){
    df$numCoop[i] = 0
    }
      else df$numCoop[i] = df$numCoop[i]

#_____Ingroup----
  #unique.numValues: 0 = cooperation, 1 = defection. Also adding as column to dataset.

  for (s in unique(numIG$SID)) { 
    j = numIG$SID == s # create a logical index
    numDefCoop_IG[j] = aggregate(x = numIG, by = list(unique.numValues = numIG$Player_move), FUN = length)

    #______defections----
    numDef_IG = ifelse((length(numDefCoop_IG$unique.numValues) == 2) & (numDefCoop_IG$unique.numValues[2] == 1), numDefCoop_IG[2,2],
    ifelse((length(numDefCoop_IG$unique.numValues)== 1) & (numDefCoop_IG[1] == 1), numDefCoop_IG[1,2], 0)[j])

    df$numDef_IG[j]= numDef_IG

    #______cooperations----
    numCoop_IG= ifelse(numDefCoop_IG$unique.numValues[1] == 0, numDefCoop_IG[1,2], 0)[j]
    numCoop_IG = ifelse((length(numDefCoop_IG$unique.numValues) == 2) & (numDefCoop_IG$unique.numValues[1] == 0), numDefCoop_IG[1,2],
                        ifelse((length(numDefCoop_IG$unique.numValues)== 1) & (numDefCoop_IG[1] == 0), numDefCoop_IG[1,2], 0))[j]

    df$numCoop_IG[j]= numCoop_IG

  }
}  

View(df)
...