2014-11-01 3 views
0

Вот текущее решение для ручного управления, которое у меня есть. Мне было интересно, как я буду применять автоматическое решение моей проблемы.Автоматическое разделение в R

smarties <- aggregate(Mention_DRGU ~ USC5_CLASS + AGE + year , data = chanko , sum)

keto <- filter(smarties, AGE == "0-2" & year == "2010")[,4]/Actual$ZERO.TWO[1] 
keto1 <- filter(smarties, AGE == "0-2" & year == "2011")[,4]/Actual$ZERO.TWO[2] 
keto2 <- filter(smarties, AGE == "0-2" & year == "2012")[,4]/Actual$ZERO.TWO[3] 
keto3 <- filter(smarties, AGE == "0-2" & year == "2013")[,4]/Actual$ZERO.TWO[4] 
blarg <- matrix(c(keto,keto1, keto2,keto3), nrow=9, ncol = 1) 
cbind(filter(smarties, AGE == "0-2")[,1:3],blarg) 

Я читал другие вопросы пользователей, которые похожи на мои, и я наткнулся на this и я пытался реализовать, но я повесил трубку, используя `tapply функцию ,

В принципе, если возраст и год похожи, я хочу, чтобы он разделился с соответствующей колонки в моем фактическом data.frame.

temp <- split(smarties, f = list(smarties$AGE, smarties$year)) 

dput(Actual)

structure(list(Region = c("Canada", "Canada", "Canada", "Canada" 
), Year = c("2010", "2011", "2012", "2013"), Level = c("ID", 
"PD", "PR", "PP"), Sex = c("3", "3", "3", "3"), Total = c(34005, 
34343, 34754, 35158), X0.2 = c(1139, 1139, 1140, 1145), X3.10 = c(2900, 
2935, 2980, 3024), X11.19 = c(3835, 3792, 3740, 3684), X20.39 = c(9247, 
9325, 9474, 9618), X40.59 = c(10106, 10150, 10185, 10197), X60.64 = c(1982, 
2050, 2071, 2110), X65. = c(4736, 4887, 5099, 5310)), .Names = c("Region", 
"Year", "Level", "Sex", "Total", "X0.2", "X3.10", "X11.19", "X20.39", 
"X40.59", "X60.64", "X65."), row.names = c(NA, -4L), class = "data.frame") 

dput(smarties)

structure(list(USC5_CLASS = structure(c(5L, 6L, 7L, 3L, 5L, 6L, 
3L, 5L, 6L, 7L, 12L, 3L, 5L, 6L, 7L, 12L, 2L, 3L, 5L, 6L, 7L, 
8L, 11L, 12L, 3L, 5L, 6L, 7L, 8L, 12L, 2L, 5L, 6L, 7L, 12L, 5L, 
8L, 5L, 6L, 3L, 4L, 5L, 6L, 7L, 8L, 3L, 5L, 6L, 7L, 3L, 4L, 5L, 
6L, 7L, 12L, 2L, 3L, 4L, 5L, 6L, 7L, 9L, 11L, 12L, 3L, 5L, 6L, 
7L, 12L, 2L, 3L, 5L, 6L, 7L, 12L, 3L, 6L, 3L, 5L, 6L, 3L, 5L, 
6L, 2L, 3L, 5L, 6L, 7L, 9L, 12L, 1L, 2L, 3L, 5L, 6L, 7L, 9L, 
12L, 3L, 5L, 6L, 7L, 12L, 2L, 3L, 5L, 6L, 7L, 8L, 12L, 12L, 5L, 
6L, 3L, 5L, 6L, 3L, 5L, 6L, 7L, 2L, 3L, 5L, 6L, 7L, 10L, 12L, 
2L, 3L, 5L, 6L, 7L, 12L, 3L, 5L, 6L, 7L, 8L, 12L, 3L, 5L, 6L, 
7L, 12L, 5L, 6L), .Label = c("15111 TETRACYCLINE", "15112 TETRACYCLINE CONGENERS", 
"15130 CEPHALOSPORIN", "15141 ERYTHROMYCIN", "15142 EXTENDED SPEC MACROLIDES", 
"15152 AMOXICILLIN", "15153 OTHER BRD SPEC PENICILL", "15180 TRIMETHOPRIM COMBS", 
"15190 BRD/MED SPEC OTHER", "15210 PENICILLIN V & VK", "15230 ANTI-STAPH PENICILLIN", 
"15810 QUINOLONES, ORAL"), class = "factor"), AGE = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 
7L, 7L, 8L, 8L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 6L, 
6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 1L, 1L, 2L, 2L, 2L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 
5L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 7L, 7L, 8L, 1L, 1L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L, 7L, 7L, 8L, 
8L), .Label = c("0-2", "3-9", "10-19", "20-39", "40-59", "60-64", 
"65+", "UNSP"), class = "factor"), year = c(2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 
2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 2012L, 
2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 
2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L, 2013L), Mention_DRGU = c(5760L, 
19230L, 5610L, 4700L, 36660L, 16070L, 7600L, 32910L, 39850L, 
2230L, 5690L, 49240L, 214790L, 144420L, 27840L, 60320L, 5520L, 
98940L, 216040L, 103030L, 27440L, 10840L, 5500L, 145650L, 5610L, 
44470L, 16510L, 7910L, 2470L, 38280L, 5520L, 61050L, 22340L, 
10390L, 28960L, 5460L, 5460L, 22380L, 2470L, 5980L, 5550L, 11370L, 
23830L, 5840L, 5590L, 14680L, 68290L, 47860L, 2110L, 73700L, 
1960L, 177290L, 177440L, 47750L, 103110L, 16650L, 57340L, 5530L, 
214590L, 143790L, 50590L, 3280L, 5680L, 104760L, 28860L, 47150L, 
5550L, 28680L, 5680L, 10970L, 5590L, 50260L, 28380L, 11480L, 
28800L, 2260L, 7820L, 13750L, 11120L, 14700L, 16840L, 55900L, 
11060L, 5680L, 39920L, 166720L, 156230L, 19990L, 5540L, 60910L, 
5540L, 10960L, 16780L, 205220L, 153830L, 30970L, 3500L, 110530L, 
5540L, 50360L, 44410L, 18140L, 16760L, 5400L, 11080L, 39180L, 
31650L, 16840L, 5530L, 55590L, 1390L, 5860L, 2100L, 2100L, 28660L, 
15460L, 5770L, 22890L, 56150L, 5540L, 17010L, 45740L, 114940L, 
224230L, 37560L, 5670L, 60150L, 11310L, 39620L, 162890L, 178530L, 
57780L, 74110L, 16900L, 15500L, 16850L, 17090L, 5610L, 14490L, 
17020L, 11350L, 45100L, 5700L, 17100L, 11340L, 5670L)), .Names = c("USC5_CLASS", 
"AGE", "year", "Mention_DRGU"), row.names = c(NA, -146L), class = "data.frame") 
+1

чек из 'sweep' –

+0

Благодаря @BenBolker я изучу это – user3900661

+0

я думаю было бы проще, если бы вы установили это по-другому. Вы просто усложняете себя, пытаясь сопоставить переменную '0-2' и имя столбца ZERO.TWO'. Также у вас есть столбец с именем 'THREE.TEN', но ваша соответствующая переменная' 3-9'. то что такое 'FIFTY.THREE' и что означает' UNSPEC' и '65 + '? – rawr

ответ

1

Это не солидно программирование, но это, кажется, работает:

# remove rows not to be analyzed 
smarties <- smarties[smarties$AGE != 'UNSP', ] 

# get row and column indices 
smarties$agenum <- as.numeric(smarties$AGE) 
smarties$colnum <- smarties$agenum + 5 
smarties$yearnum <- as.numeric(as.factor(smarties$year)) 

# send col and row index (x and y) to find denominator from Actual df, 
# and numerator z 
smarties$result <- mapply(FUN = function(x,y,z,df){ 
    z/df[x,y] 
},x = smarties$yearnum,y = smarties$colnum,z = smarties$Mention_DRGU,MoreArgs = list(df = Actual)) 

Это зависит от возраста и года идет в правильном порядке, а также колонны пребывания, где они находятся в правильном порядке ,

Update

Это не сломается так легко, потому что он использует имена. Вы можете использовать то, что * применимо, имеет смысл для вас.

# remove rows not to be analyzed 
smarties <- smarties[smarties$AGE != 'UNSP', ] 

# rename variable names and fix weird names 
smarties$agecol <- paste0('X',gsub(pattern = '\\-|\\+',replacement = '.',x = smarties$AGE)) 
smarties[smarties$agecol == 'X3.9','agecol'] <- 'X3.10' 
smarties[smarties$agecol == 'X10.19','agecol'] <- 'X11.19' 

# mapply 
smarties$mresult <- mapply(FUN = function(x,y,z,df){ 
    z/df[df$Year == x,names(df) == y] 
},x = smarties$year,y = smarties$agecol,z = smarties$Mention_DRGU,MoreArgs = list(df = Actual)) 

# or apply 
smarties$appresult <- apply(smarties,1,function(x,df){ 
    as.numeric(x['Mention_DRGU'])/df[df$Year == x['year'],names(df) == x['agecol']] 
},df = Actual) 

Update 2 Это лучший способ пойти путем изменения данных в согласованном формате.

Исправить набор данных:

# tidy data aka wide to long format 
require(tidyr) 
smarties <- smarties[smarties$AGE != 'UNSP', ] 
Actual <- gather(Actual,age,secretvalue,-c(Region,Year,Sex,Level,Total)) 

# fix age mismatches (should actual type them in) 
Actual$age <- levels(smarties$AGE)[as.numeric(Actual$age)] 

# make names in both datasets the same 
names(Actual) <- tolower(names(Actual)) 
names(smarties) <- tolower(names(smarties)) 

После реструктуризации данных, решение простое

# merge appropriate data since it is 1:1 
smartiesmerged <- merge(smarties,Actual[ ,c('year','age','secretvalue')],by = c('year','age'),all.x = T) 

# do the calculation 
smartiesmerged$result <- smartiesmerged$mention_drgu/smartiesmerged$secretvalue 
+0

Эй, Эндрю, ваш код совершенен. Я просто хотел что-то спросить (но это не требовало создания нового сообщения), как бы добавить другую переменную, чтобы она соответствовала (например, было сделано с помощью agecol). Теперь у меня есть столбец как моих умных, так и фактических данных, представляющих регион. – user3900661

+0

Для первого обновления вам придется кормить данные региона везде, где есть agecol. Реструктуризация ваших данных, например, в обновлении 2 (ссылка hasley's comment) делает техническое обслуживание подобно добавлению переменных тривиальными. Вы добавили бы «область» в оба элемента c() в функцию слияния, и это все. – ARobertson

+0

Ой, это такой простой способ подойти к этой проблеме. Благодаря! Я на самом деле согласился с рекомендацией hadley и добрался до ваших данных, поэтому было невероятно легко реализовать. – user3900661

0

Я предполагаю, что я нашел несколько меньше ручной способ сделать это с dplyr.

blarb <- melt(Actual) 

Lol <- filter(blarb, variable == "X0.2", Year == "2010") 
smarties %>% 
    filter(AGE == "0-2", year == 2010) %>% 
    mutate(Popul = Mention_DRGU/Lol$value) 

К сожалению, я до сих пор сделать это для каждого возраста и года, кто-нибудь знает, если я мог бы использовать group_by для дальнейшей автоматизации этого?

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