我的问题更多的是关于用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])