R: перебрать уникальные значения столбца и вычислить новые переменные - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь перебрать набор данных, ссылаясь на уникальные значения в одном столбце (SID).Я хочу создать несколько переменных на основе существующих столбцов в кадре данных.Они будут рассчитаны для каждого уникального значения SID.В настоящее время мой код не разделяется на основе уникального значения SID.Он суммирует значения для всего набора данных.

Вот пример:

Данные:

fpd_2b.csv

В кадре данных 40 строк.20 строк имеют значение «9003» в SID, а 20 - «1028».

Я хочу создать переменную и столбец с именем «numPR», который представляет собой сумму значенийстолбец, который уже существует в df ("PreviewRound").Значения в «PreviewRound» равны 0 или 1 с.

В этом конкретном примере numPR должно быть 6 для каждого уникального значения SID, однако в настоящее время оно равно 12 (оно не разделяется по SID).

Вот код:

file = "fpd_2b.csv"
headers = read.csv(file, header = F, nrows = 1, as.is = T)

df = read.csv(file, skip = 2, header = F)
colnames(df) = headers

# Remove blank rows (there is a blank row between each unique SID)
df = subset(df, SID  >1)

df$SID = factor(df$SID)

for (sid in unique(df$SID)) { 
  numPR = sum(df$PreviewRound)
  df$numPR = numPR
}

Весь столбец numPR заполнен 12, однако он должен быть заполнен 6 (6 для 9003 и 6 для 1028).Любая помощь приветствуется!Я проверил подобные посты на Stack Overflow и других сайтах, но мне не повезло с моей проблемой.Я уверен, что решение довольно простое, и большое спасибо за вашу помощь, ребята!

1 Ответ

0 голосов
/ 20 октября 2018

Если мы хотим создать столбец, используйте 'SID' в качестве переменной группировки

df$numPR <- with(df, ave(PreviewRound, SID, FUN = sum))

или, если мы хотим получить итоговый вывод, используйте aggregate

aggregate(PreviewRound~ SID, df, FUN = sum)

Проблема с кодом ОП заключается в том, как заменяемые значения

df$numPR = numPR

в цикле for ОП и, что более важно,

numPR = sum(df$PreviewRound) 

принимает sum всегоСтолбец «PreviewRound»

Столбец «numPR» обновляется каждый раз, когда выполняется цикл for, оставляя только один sum из last обновленного unique «SID».Чтобы избежать этого, используйте индекс

df$numPR <- NA
for (sid in unique(df$SID)) { 
    i <- df$SID == sid # create a logical index
    numPR = sum(df$PreviewRound[i]) # subet the data based on the index
  df$numPR[i] = numPR # assign the values only to those selected rows
}
...