Один вариант с base R
будет состоять в том, чтобы извлечь подстроку второго столбца, которая соответствует элементам NA
в первом столбце, и обновить элементы первого столбца NA
, извлекая значение
i1 <- is.na(df1$Email) # create a logical index
df1$Email[i1] <- regmatches(df1$Subject[i1],
regexpr("[a-z]+@.*\\.com", df1$Subject[i1]))
df1
# Email Subject
#1 a@site.com developer_id=a@site.com&app_id=a&appname=a
#2 b@site.com developer_id=b@site.com&app_id=b&appname=b
#3 c@site.com <NA>
#4 d@site.com developer_id=d@site.com&app_id=d&appname=d
Или с использованием tidyverse
library(tidyverse)
df1 %>%
mutate(Email = case_when(is.na(Email) ~ str_extract(Subject, "[a-z]+@.*\\.com"),
TRUE ~ Email))
Кроме того, поскольку OP упоминает об отдельных строках в качестве идентификаторов, мы можем использовать регулярное выражение для просмотра вдоль этих строк, т.е. для извлечения всех символов, следующих за developer_id=
и предшествует &app_id
df1 %>%
mutate(Email = case_when(is.na(Email) ~
str_extract(Subject, "(?<=developer_id\\=).*(?=&app_id)"),
TRUE ~ Email))
data
df1 <- structure(list(Email = c("a@site.com", NA, "c@site.com", NA),
Subject = c("developer_id=a@site.com&app_id=a&appname=a",
"developer_id=b@site.com&app_id=b&appname=b", NA,
"developer_id=d@site.com&app_id=d&appname=d"
)), class = "data.frame", row.names = c(NA, -4L))