如何提取R中的细胞,它刚好在用正则表达式匹配的细胞下面



我的问题更多的是关于用r编码。我在r中有以下鼠标类型的数据帧:

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

目标:我想创建一个新的变量"c",它的值分别为"xxx"one_answers"yyy",位于第3行和第6行。

注意:我不能在"xxx"one_answers"yyy"上匹配,因为这在我的真实数据中是不可能的。使用regex,我的想法是匹配"橙色",然后从下一行提取数据。

我试过:

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

但它不起作用,因为R中的新行不是换行或回车,我想。

想法如下:我想检测包括"橙色"的行,即:

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

然后取行号并告诉R提取后续行以创建新变量"c">

让它变得更复杂,实际上我的任务更难

在下一个任务中,我必须提取"橙色1"、"橙色2"、…之间的所有行,。。。,"橙色10",并创建一个类似于以前的新变量。

我们可以使用str_detect来查找"b"列中的"orange"元素作为逻辑向量,获取该向量的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])

最新更新