2015-02-23 11 views
-1

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

data1 <- data.frame(ID = c(1,2), Description = c("Chiquita","Chiquita mazamorra"), Max = c(200,125)) 
    data2 <- data.frame(ID = c(1,2,3,4,5,6,7), Description = c("Chiquita mini", "Chiquita Oriville","Chiquita 24h","Manzano Chiquita 5j...","Chiquita mazamorra 1,2h..","Chiquita mazamorra Buro","Chiquita AM 2F"), Max = c(24,110,80,90,134,123,210)) 

У меня есть набор данных, data1, как показано ниже

Id  Description   Max 
    1  Chiquita    200 
    2  Chiquita mazamorra  125 

У меня есть еще один набор данных, data2, как показано ниже

Id  Description     Actual 
    1  Chiquita mini     24 
    2  Chiquita Oriville    110 
    3  Chiquita 24h     80 
    4  Manzano Chiquita 5j...  90 
    5  Chiquita mazamorra 1,2h... 134 
    6  Chiquita mazamorra Buro  123 
    7  Chiquita AM 2F    210 
    8  Chiquita.....     124 
    9  Chiquita(P)     213 
    10  Chiquita, mazamorra, S  188     

Если оператор должен проверить, содержит ли описание Data2 этот символ в данных2 $ Описание Ch iquita mazamorra, если да, то проверьте, действительно ли Data2 $ Actual> Data1 $ Max. Если да, то результаты == Хорошие, еще малые. Обратите внимание, там могут быть другие символы после Чикита mazamorra как, например Чикита mazamorra 1,2H .. это хорошо, но не Чикита mazamorra Buro

Аналогично другим IfElse следует проверить, если Data2 Описание содержит Чикита если да, тогда проверьте, действительно ли Data2 $ Actual> Data1 $ Max. Если да, то результаты == Хорошие, еще малые. Там могут быть и другие символы после Чикита, как, например, Чикита 24h или Чикита AM 2F это все в порядке, но не Чикита мини или Чикита Oriville

Это конечный желаемый результат (data2)

Id  Description     Actual  Result 
    1  Chiquita mini     24   NA 
    2  Chiquita Oriville    110   NA 
    3  Chiquita 24h     80   Small 
    4  Manzano Chiquita 5j...  90   NA 
    5  Chiquita mazamorra 1,2h... 134   Good   
    7  Chiquita mazamorra Buro  123   NA 
    6  Chiquita AM 2F    210   Good 
    8  Chiquita.....     124   Small 
    9  Chiquita(P)     213   NA 
    10  Chiquita, mazamorra, S  188   Good 

Я знаю, что это можно сделать, используя комбинацию grepl и ifelse, которые я не очень уверен? Может быть, есть лучший способ сделать это, я не знаю, я очень смущен. Нужна помощь.

+0

Просьба предоставить воспроизводимый пример, если вам действительно нужна помощь: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Metrics

ответ

0

Вот общая схема решения

data1 <- read.csv(text= 
"Id,Description,Max 
1,Chiquita,200 
2,Chiquita mazamorra,125") 

data2 <- read.csv(text= 
"Id,Description,Actual 
1,Chiquita mini,24 
2,Chiquita Oriville,110 
3,Chiquita 24h,80 
4,Manzano Chiquita 5j,90 
5,Chiquita mazamorra 12h,134 
6,Chiquita mazamorra Buro,123 
7,Chiquita AM 2F,210") 


# start by trimming the description to the first few words 
# that don't start with a number 
data2$Description_trimmed <- gsub('\\s+\\d.*$','',data2$Description) 

# initialize the output field 
data2$Results <- NA 

# loop while there are missing values in data$Results 
while(any(is.na(data2$Results))){ 

    # identify records that still need to be calculated 
    indx <- is.na(data2$Results) 

    # calculate the result based on the current trimmed description 
    data2[indx,'Results'] <- ifelse(
       data2[indx,'Actual'] < 
        data1[match(data2[indx,'Description_trimmed'], 
           data1[ ,'Description']), 
          "Max"], 
       'Good', 
       'Small') 

    # trim the last word from Description_trimmed 
    data2$Description_trimmed <- gsub('(^| +)[^ ]*$','',data2$Description_trimmed) 

    # stop if the remaining trimmed descriptions are empty 
    if(all(grepl('^\\s*$',data2$Description_trimmed))) 
     break 
} 

data2 
#> Id    Description Actual Description_trimmed Results 
#> 1 1   Chiquita mini  24      Good 
#> 2 2  Chiquita Oriville 110      Good 
#> 3 3   Chiquita 24h  80      Good 
#> 4 4  Manzano Chiquita 5j  90      <NA> 
#> 5 5 Chiquita mazamorra 12h 134      Small 
#> 6 6 Chiquita mazamorra Buro 123      Good 
#> 7 7   Chiquita AM 2F 210      Small 

(BTY, это решение вычисляет is.na(data$Results) дважды за цикл, в то время как вы только действительно нужно, чтобы вычислить его один раз - я собирался для удобства чтения не эффективность в этом аспект ...)

+0

попробовал ваше решение код переходит в бесконечный цикл, также меня путают с некоторыми переменными, на которые вы ссылались в предлагаемом решении для ex достаточные данные $ Результаты? Я предполагаю, что это data2 $ Результаты: –

+0

'data' должен был быть' data2'. См. Правки. – Jthorpe

+0

:), что исправление работает, но логический доцент принимает случаи, когда описание имеет конец ... например, строка 8, Data2, так как это наблюдение относится к правилу 1 в data1 (data1, row1), я надеялся, что результаты показывают небольшой или хороший, но прямо сейчас он показывает NA :), аналогично, когда есть, между которыми находится строка 10 data2. Прошу прощения, это очень дикий набор данных, и я очень благодарен за помощь. –