2015-09-25 3 views
1

Цель состоит в том, чтобы свернуть/повторно назначить уровни как часть очистки набора данных.Регулярное выражение grep-parsing из 2 переменных

Вот пример:

df <- data.frame(V1 <- c("cat","lion","cat","beast","cat"), 
      V2 <- c("nice and grumpy","angry","old,but also nice","empty","has friends"), 
      stringsAsFactors = F); colnames(df) <- c("V1","V2") 
>df 
    V1   V2 
1 cat nice and grumpy 
2 lion    angry 
3 cat old,but also nice 
4 beast    empty 
5 cat  has friends 

Уровень интереса cat; эти записи:

parse1 <- V1[grepl("cat",V1)] 
#[1] "cat" "cat" "cat" 

Оттуда, идея заключается в том, чтобы найти атрибут в V2, nice, на которой уровень cat будет переименован в nice cat. Этот поиск находит 2 записей, представляющих интерес в V2:

df.sub <- subset(df,V1=="cat",select=V1:V2) 
parse2 <- df.sub$V2[grep("([Nn]ice)",df.sub$V2)] 
#[1] "nice and grumpy" "old,but also nice" 

Идеальный конечный результат был бы df преобразованные в:

 V1    V2 
1 nice cat nice and grumpy 
2 lion   king 
3 nice cat old,but also nice 
4 beast   empty 
5 cat  has friends 

Любые мысли, как достичь этого? Большое спасибо.

+2

Donno как приходит король .. –

ответ

1

ifelse, кажется, достаточно для этого:

df$V1 <- ifelse(grepl("([Nn]ice)", df$V2), 
       sub('cat', 'nice cat', df$V1), 
       df$V1) 

Выход:

> df 
     V1    V2 
1 nice cat nice and grumpy 
2  lion    angry 
3 nice cat old,but also nice 
4 beast    empty 
5  cat  has friends 
+0

@ LyzandeR: Большое спасибо! – remi

+0

Ты рад, рад, что я мог бы помочь :). Чтобы быть справедливым, если у вас массивный data.frame (например, более 1 м строк), 'data.table', безусловно, будет намного быстрее (вот почему он был создан). 'data.table' имеет несколько иной синтаксис, чем обычные операции data.frame, которые вам нужно будет ознакомиться прежде, чем вы будете использовать. Убедитесь, что вы используете его в правильном направлении. В другом ответе 'paste0' и проверке, является ли' V1 == 'cat'' кажущимся излишним и замедлит код (я предполагаю, что исходный кадр данных может быть другим). – LyzandeR

1

Вы можете использовать data.table

df <- data.frame(V1 <- c("cat","lion","cat","beast","cat"), 
     V2 <- c("nice and grumpy","angry","old,but also nice","empty","has friends"), 
     stringsAsFactors = F); colnames(df) <- c("V1","V2") 

library(data.table) 
DT <- data.table(df) 
# All the nice animals 
DT[grepl ("([Nn]ice)",V2), V3:= paste0("nice ",V1)] 
# All the nice cats 
DT[grepl ("([Nn]ice)",V2) & V1=="cat", V4:= paste0("nice ",V1)] 
+0

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

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