Как извлечь ячейку в R, которая находится под той, что сопоставляется с регулярным выражением - PullRequest
1 голос
/ 11 ноября 2019

мой вопрос больше о кодировании с помощью r. У меня есть следующий тип фрейма данных Микки Мауса в R:

df <- data.frame(a=c(1:6), b=c("apple", "orange 1", "xxx", "lemon", "orange 2", "yyy"))

Цель: Я хотел бы создать новую переменную "c", которая имеет значения "xxx" и "yyy" в 3-м и6-я строка соответственно.

Предостережение: я не могу сопоставить "xxx" и "yyy", просто потому, что это невозможно в моих реальных данных. С помощью регулярных выражений моя идея состоит в том, чтобы сопоставить «оранжевый», а затем извлечь данные из следующей строки.

Я пытался:

regx <- "^orange\\s\\d+[\r\n]+(.*)"
df <- df %>%
  extract(b, "c", regx, remove=FALSE)

Но это не работает, так как новая строкав R это не новая строка или возврат каретки, я думаю.

Идея будет в следующем: я хотел бы обнаружить строки, которые включают "оранжевый", то есть:

df[grepl("^orange\\s\\d+", df$b), ]

Затем возьмите номера строк и скажите R извлечь последующие строки, чтобы создать новую переменную "c"

Чтобы сделать ее более сложной, моя задача на самом деле еще сложнее! :

В следующем задании мне нужно извлечь все строки между «orange 1», «orange 2», ..., «orange 10» и создать новую переменную, аналогичную предыдущей.

1 Ответ

1 голос
/ 11 ноября 2019

Мы можем использовать str_detect, чтобы найти «оранжевые» элементы в столбце «b» в качестве логического вектора, получить lag этого вектора, использовать его в case_when, чтобы вернуть столбец «b», иначевозврат NA

library(dplyr)
library(stringr)
df %>%
    mutate(c = case_when(lag(str_detect(b,  "^orange\\s\\d+$"),
         default = FALSE) ~ as.character(b), TRUE ~ NA_character_))
# a        b    c
#1 1    apple <NA>
#2 2 orange 1 <NA>
#3 3      xxx  xxx
#4 4    lemon <NA>
#5 5 orange 2 <NA>
#6 6      yyy  yyy

Или в base R

i1 <- grep("^orange\\s*\\d+$", df$b) + 1
df$c[i1] <- as.character(df$b[i1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...