Я изо всех сил пытаюсь добавить df с новыми переменными, которые вычисляются из подмножества этого df.
У меня две цели:
- Объединить множество отдельных наборов данных в один,Переменная индекса - «SID» (идентификатор субъекта).
- Создание новых переменных / столбцов в этом основном наборе данных.
Прикрепленные данные являются примером того, что будет уже объединенный набор данныхпохоже, но содержит только 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)