2015-11-17 1 views
2

У меня есть фрейм данных с данными следующим образом (хотя мой набор данных намного больше)счета Сумма данных в dataframe на основе размера ассоциированного числовой переменной

ID Count Size 
1 1  35 
1 2  42 
1 2  56 
2 3  25 
2 5  52 
2 2  62 

и т.д ....

Я хотел бы извлечь общее количество для каждого идентификатора, но раскола для того, когда переменной величины либо < 50 или < = 50

до сих пор я сделал это, чтобы получить кумулятивный подсчет на основе уникального идентификатора

cbind(aggregate(Count~ID, sum, data=df) 

Для производства этого

ID Count 
1 5 
2 10 

Но я хочу, чтобы произвести что-то вроде этого вместо

ID <50 >=50 
1 3 2 
2 3 7 

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

ответ

1

Мы могли бы использовать data.table. Преобразуйте «data.frame» в «data.frame» в «data.table» (setDT(df1)), сгруппированный по «ID», мы получим sum «Count» на основе логических индексов («Размер Размер> = 50`)

library(data.table) 
setDT(df1)[,list(`<50` = sum(Count[Size <50]), 
      `>=50` = sum(Count[Size>=50])) , by = ID] 
# ID <50 >=50 
#1: 1 3 2 
#2: 2 3 7 

аналогичный вариант с dplyr является

library(dplyr) 
df1 %>% 
    group_by(ID) %>% 
    summarise(`<50` = sum(Count[Size <50]), 
      `>=50` = sum(Count[Size>=50])) 

ПРИМЕЧАНИЕ: лучше назвать столбцы less50, greaterthanEq50 вместо имен предложил в ожидаемом выходе.

+1

Спасибо, что это именно то, что я был после! –

0

Продолжите свою идею, вы можете на самом деле aggregate на df[df$Size<50,] вместо df, и сделайте это снова для> = 50, затем слейте.

d1 = aggregate(Count~ID,sum,data=df[df$Size<50,]) 
d2 = aggregate(Count~ID,sum,data=df[df$Size>=50,]) 
merge(d1,d2,by="ID",all=TRUE) 

Это просто основано на том, что вы уже сделали, но не самый лучший я думаю ..

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