2014-09-16 5 views
0

Я имею dataframe dsагрегатного dataframe подмножество R

CountyID ZipCode Value1 Value2 Value3 ... Value25 
    1  1   0  etc  etc   etc 
    2  1   3  
    3  1   0  
    4  1   1  
    5  2   2  
    6  3   3  
    7  4   7 
    8  4   2  
    9  5   1  
    10  6   0  

и хотел бы агрегат, основанный на ds$ZipCode и установить ds$CountyID равные первичную основой округа на самом высоком ds$Value1. Для приведенного выше примера, это будет выглядеть следующим образом:

CountyID ZipCode Value1 Value2 Value3 ... Value25 
    2  1   4  etc  etc   etc 
    5  2   2  
    6  3   3  
    7  4   9  
    9  5   1  
    10  6   0  

Все ValueX столбцы сумма этого столбца, сгруппированные по ZipCode.

Я пробовал кучу разных стратегий за последние пару дней, но никто из них не работает. Лучшее, что я придумал это

#initialize the dataframe 
ds_temp = data.frame() 

#loop through each subset based on unique zipcodes 
for (zip in unique(ds$ZipCode) { 

    sub <- subset(ds, ds$ZipCode == zip)           
    len <- length(sub)                
    maxIndex <- which.max(sub$Value1)       

    #do the aggregation 
    row <- aggregate(sub[3:27], FUN=sum, by=list(         
     CountyID = rep(sub$CountyID[maxIndex], len),       
     ZipCode = sub$ZipCode))     

    rbind(ds_temp, row)                
}                     

ds <- ds_temp 

Я не был в состоянии проверить это на реальных данных, но с фиктивными наборов данных (например, один из приведенных выше), я получаю ошибку «аргументы должны имеют одинаковую длину). Я возился с репутацией() и фиксированные векторы (например c(1,2,3,4)), но независимо от того, что я делаю, то ошибка не повторится. Я тоже иногда получаю сообщение об ошибке с эффектом

не может подмножество данных типа «закрытие».

Любые идеи? Я также пытался возиться с data.frame(), ddply(), data.table(), dcast() и т.д.

+0

В ответ на ваши комментарии, я добавил ответ, который отображает имена столбцов красиво –

ответ

2

Вы можете попробовать это:

data.frame(aggregate(df[,3:27], by=list(df$ZipCode), sum), 
    CountyID = unlist(lapply(split(df, df$ZipCode), 
    function(x) x$CountyID[which.max(x$Value1)]))) 

Полностью воспроизводимые данные выборки:

df<-read.table(text=" 
CountyID ZipCode Value1  
    1  1   0 
    2  1   3  
    3  1   0  
    4  1   1  
    5  2   2  
    6  3   3  
    7  4   7 
    8  4   2  
    9  5   1  
    10  6   0", header=TRUE) 

data.frame(aggregate(df[,3], by=list(df$ZipCode), sum), 
    CountyID = unlist(lapply(split(df, df$ZipCode), 
    function(x) x$CountyID[which.max(x$Value1)]))) 

# Group.1 x CountyID 
#1  1 4  2 
#2  2 2  5 
#3  3 3  6 
#4  4 9  7 
#5  5 1  9 
#6  6 0  10 
+0

кажется, работает хорошо на выборочных данных. Есть ли способ сохранить имена столбцов? – stephentgrammer

+1

@aquamole вы можете сделать что-то вроде 'names (newdf) [1:26] <- names (originaldf) [2:27]'. – Jota

1

В ответ на ваш комментируйте ответ Фрэнка, вы можете сохранить имена столбцов, используя метод формулы в aggregate. Используя данные Фрэнкса в df, это было бы

> cbind(aggregate(Value1 ~ ZipCode, df, sum), 
     CountyID = sapply(split(df, df$ZipCode), function(x) { 
      with(x, CountyID[Value1 == max(Value1)]) })) 
# ZipCode Value1 CountyID 
# 1  1  4  2 
# 2  2  2  5 
# 3  3  3  6 
# 4  4  9  7 
# 5  5  1  9 
# 6  6  0  10 
+0

Это работает, но, к сожалению, я должен был бы описать все 25 имен столбцов значений. – stephentgrammer

+0

Нет, нет. Просто используйте подмножество 'names (df)' с 'setNames' –

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