2016-03-22 3 views
2

Я пытался сделать условную сумму на основе data.frame с дубликатами. Я хочу суммировать те, у которых есть идентичная пермо и дата, и создать отдельный столбец с этой информацией, заполняющей NA или предпочтительные 0.Условная сумма на data.frame на основе дубликатов

Мой набор данных выглядит следующим образом:

data.frame(crsp) 

    permno  date PAYDT DISTCD divamt FACPR FACSHR PRC  RET 
1 10022 19280929 19281001 1272 0.25  0  0 71.00 0.045208 
2 10022 19280929 19281001 1232 1.00  0  0 71.00 0.045208 
3 10022 19281031  NA  NA  NA NA  NA 73.50 0.035211 
4 10022 19281130  NA  NA  NA NA  NA 72.50 -0.013605 
5 10022 19281231 19290202 1232 1.00  0  0 68.00 -0.044828 
6 10022 19281231 19290202 1272 0.25  0  0 68.00 -0.044828 
7 10022 19290131  NA  NA  NA NA  NA 73.75 0.084559 
8 10022 19290228  NA  NA  NA NA  NA 69.00 -0.064407 
9 10022 19290328 19290401 1232 1.00  0  0 65.00 -0.039855 
10 10022 19290328 19290401 1272 0.25  0  0 65.00 -0.039855 
11 10022 19290430  NA  NA  NA NA  NA 67.00 0.030769 
12 10022 19290531  NA  NA  NA NA  NA 64.75 -0.033582 

Во-первых, я создал permno + дата, чтобы сделать уникальный пикап-код

crsp$permnodate = paste(as.character(crsp$permno),as.character(crsp$date),sep="") 

Во-вторых, я тогда попытался подвести дублированные и превращение этого в новую раму:

crsp_divsingl <- aggregate(crsp$divamt, by = list(permnodate = crsp$permnodate), FUN = sum, na.rm = TRUE) 

Однако я не могу правильно передать эту информацию к оригиналу data.frame(crsp), так как столбцы имеют разные длины, где cbind и cbind.fill не позволяют мне правильно соответствовать. В частности, я хочу получить сумму divamts для одного/первого из уникальных пермодатов, чтобы он соответствовал оставшимся data.frame в длину. Я также не получил merge или match.

Я еще не пробовал функции цикла или удалось создать любые функции if или ifelse с последовательностью. В принципе, это можно сделать в excel с помощью формулы VLOOKUP или index.match, однако это более сложно в R, чем я сначала думал.

Помощь очень ценится.

С наилучшими пожеланиями

Troels

+0

Для этого вы можете использовать 'duplicated'. Я пишу ответ ниже, но один вопрос, когда вы говорите: «Создайте отдельный столбец с этой информацией, заполняющей NA или предпочтительные 0». Вы имеете в виду, что хотите преобразовать значения NA в данные в 0? – giraffehere

+0

Привет, благодарю вас за комментарий! Я использую функцию 'duplicated' для создания отдельного' data.frame' только для отдельных цен (другая часть набора данных, которую я пытаюсь реплицировать). Итак, потому что существует несколько перестановок, и я хочу иметь одну сумму для этих дубликатов, другие строки в новом столбце, где дубликаты, должны переносить либо то же значение, что и первое permnodate, либо, альтернативно, быть 0 или NA. В противном случае отдельный столбец будет иметь разную длину, чем другие столбцы на листе. Надеюсь, это имеет смысл. Я попробую ваш ответ ниже. Благодаря! –

+0

Хороший материал. Дайте мне знать, с чем я могу помочь. – giraffehere

ответ

0

Вы можете использовать duplicated и merge для достижения этой цели более легко. Я написал пример. Вам придется изменить это для своих целей, но, надеюсь, он поместит вас на нужную траекторию:

# Creating a fake sample dataset. 
set.seed(9) 
permno <- 10022:10071 # Allowing 50 possible permno's. 
date <- 19280929:19280978 # Allow 50 possible dates. 
value <- c(NA, 1:9) # Allowing NA or a 0 through 9 value. 

# Creating fake data frame. 
crsp <- data.frame(permno = sample(permno, 1000, TRUE), date = sample(date, 1000, TRUE), value = sample(value, 1000, TRUE)) 

# Loading a function that uses duplicated to get both the duplicated rows and the original rows. 
fullDup <- function(x) { 

    bool <- duplicated(x) | duplicated(x, fromLast = TRUE) 
    return(bool) 

} 

# Getting the duplicated rows. 
crsp.dup <- crsp[fullDup(crsp[, c("permno", "date")]), ] # fullDup returns a boolean of all the rows that were duplicated to another row by permno and date including the first row. 

# Now aggregate. 
crsp.dup[is.na(crsp.dup)] <- 0 # Converting NA values to 0. 
crsp.dup <- aggregate(value ~ permno + date, crsp.dup, sum) 
names(crsp.dup)[3] <- "value.dup" # Changing the name of the value column. 

# Now merge back in with the original dataset. 
crsp <- merge(crsp, crsp.dup, by = c("permno", "date"), all.x = TRUE) 
+1

Мне удалось решить проблему, используя нижнюю строку в пакете dplyr: crsp <- full_join (crsp_divsingl, crsp, by = "permnodate") Кажется, что это сработало. Спасибо за помощь! –

+0

Звучит неплохо. В качестве примечания, 'full_join' должен быть эквивалентен' merge' с аргументом 'all = TRUE'. – giraffehere

Смежные вопросы