2015-10-22 3 views
0

У меня есть функция для очистки моих данных и сохранения только тех наблюдений, которые я хочу, но которые включают в себя множество операторов if. У меня есть порядок для кодов, которые я хочу сохранить по id.Уменьшите количество операторов if в R

clear.data = function(x) 
{ 
    A = unique(x$code) 

    if (4 %in% A ) 
    {x = subset(x,code==4)} 
    else if (10404 %in% A) 
    {x = subset(x,code==10404)} 
    else if (3942 %in% A) 
    {x = subset(x,code==3942)} 

    else {x=x} 

    return(x) 
} 

Например, в данных х

x = data.frame(id = c("A","A", "A", "B", "B","B", "B","C","C", "C","C"), 
       date = c("29/05/2013", "23/08/2011", "25/09/2011", "18/11/2011", "10/07/2013", "04/10/2011", "10/11/2011", 
         "15/12/2011", "10/02/2008", "07/09/2009", "22/03/2012"), 
       code = c(4,4,3942,4,10404,3942,10404,10404,3942,10404,3942)  ) 

Я буду использовать lapply держать только замечания лицом Я заинтересован

> lapply(split(x,x$id),clear.data) 
$A 
    id  date code 
1 A 29/05/2013 4 
2 A 23/08/2011 4 

$B 
    id  date code 
4 B 18/11/2011 4 

$C 
    id  date code 
8 C 15/12/2011 10404 
10 C 07/09/2009 10404 

Проблема заключается в том, что у меня есть 150 кодов так это много утверждений if и большой набор данных для применения моей функции. Есть ли способ как-нибудь уменьшить инструкции if? Я разозлил голову, чтобы найти решение и много искал, но ничего не мог найти. У тебя есть идеи? Большое спасибо

ответ

1

Вы можете создать вектор всех возможных кодов (в порядке «важности») и просто взять первый, найденный для подмножества.

clear.data = function(x) 
{ 
    A = unique(x$code) 

    codes <- c(4, 10404, 3942) 

    # get boolean list of matches 
    matches <- codes %in% A 

    # if no matches, return x 
    if(all(!matches)){ 
     return(x) 
    }else{ 
     # else take first match 
     sub_code <- codes[which.max(matches)] 
     x <- subset(x, code == sub_code) 
    } 

    return(x) 
} 
0

Не уверен, полностью ли я понимаю вашу цель, но вот решение, которое дает вам список со всеми комбинациями идентификаторов и кода, полные записи.

Использование данных:

A <- unique(x$code) 
B <- unique(x$id) 
z <- list(NULL) 
k <- 1 

for(i in A) 
    for(j in B) 
    { 
    y <- (x[ (x$id == j & x$code == i), ]) 
    if(length(y[, 1 ]) > 0) 
    { 
     z[[ k ]] <- y 
     names(z)[ k ] <- paste(i, "-", j, sep = "") 
     k <- k + 1 
    } 
    } 

z 
$`4-A` 
    id  date code 
1 A 29/05/2013 4 
2 A 23/08/2011 4 

$`4-B` 
    id  date code 
4 B 18/11/2011 4 

$`3942-A` 
    id  date code 
3 A 25/09/2011 3942 

$`3942-B` 
    id  date code 
6 B 04/10/2011 3942 

$`3942-C` 
    id  date code 
9 C 10/02/2008 3942 
11 C 22/03/2012 3942 

$`10404-B` 
    id  date code 
5 B 10/07/2013 10404 
7 B 10/11/2011 10404 

$`10404-C` 
    id  date code 
8 C 15/12/2011 10404 
10 C 07/09/2009 10404