R 筛选数据列具有特定的字

R 筛选数据列具有特定的字,r,dataframe,R,Dataframe,我有一个数据帧: ID Value 1 {"user_id":112312} 2 {"email":#####@gmail.com, "phone":#######578} 3 {"email":#####@gmail.com} 4 {"user_id":234242} 我想过滤这个数据框,并保留列值中有“email”的行。因此,期望的结果是: ID Valu

我有一个数据帧:

ID    Value
1    {"user_id":112312}
2    {"email":#####@gmail.com, "phone":#######578}
3    {"email":#####@gmail.com}
4    {"user_id":234242}
我想过滤这个数据框,并保留列值中有“email”的行。因此,期望的结果是:

ID    Value
2    {"email":#####@gmail.com}
3    {"email":#####@gmail.com}

使用
dplyr

dataframe %>% filter(across(Value, ~ grepl('email', .)))

使用
dplyr

dataframe %>% filter(across(Value, ~ grepl('email', .)))

baser
解决方案是:

#Code
df2 <- df[grepl('email',df$Value),]
使用的一些数据:

#Data
df <- structure(list(ID = c(1, 2, 3, 4), Value = c("{\"user_id\":112312}", 
"{\"email\":#####@gmail.com, \"phone\":#######578}", "{\"email\":#####@gmail.com}", 
"{\"user_id\":234242}")), class = "data.frame", row.names = c(NA, 
-4L))
#数据

dfA
base R
解决方案为:

#Code
df2 <- df[grepl('email',df$Value),]
使用的一些数据:

#Data
df <- structure(list(ID = c(1, 2, 3, 4), Value = c("{\"user_id\":112312}", 
"{\"email\":#####@gmail.com, \"phone\":#######578}", "{\"email\":#####@gmail.com}", 
"{\"user_id\":234242}")), class = "data.frame", row.names = c(NA, 
-4L))
#数据

df您可以将包含
“email”
部分的行子集,然后提取电子邮件的模式

library(dplyr)
library(stringr)

df %>%
  filter(str_detect(Value, "email")) %>% 
  mutate(Value = str_c('{', str_extract(Value, '"email[^,}]+'), '}'))

#   ID                     Value
# 1  2 {"email":#####@gmail.com}
# 2  3 {"email":#####@gmail.com}

您可以将包含
“email”
部分的行子集,然后提取电子邮件的模式

library(dplyr)
library(stringr)

df %>%
  filter(str_detect(Value, "email")) %>% 
  mutate(Value = str_c('{', str_extract(Value, '"email[^,}]+'), '}'))

#   ID                     Value
# 1  2 {"email":#####@gmail.com}
# 2  3 {"email":#####@gmail.com}

首先,它看起来像是来自JSON数据,当您第一次加载它时,最好正确地解析它。试试这个包
jsonlite

代替此操作,您可以尝试以下方法删除手机数据:

library(tidyverse)

df <- structure(list(ID = c(1, 2, 3, 4), Value = c("{\"user_id\":112312}", 
                                                   "{\"email\":#####@gmail.com, \"phone\":#######578}", "{\"email\":#####@gmail.com}", 
                                                   "{\"user_id\":234242}")), class = "data.frame", row.names = c(NA, -4L))

df %>% 
  as_tibble() %>% 
  mutate(Value = str_sub(Value, 2, -2),
         Value = str_split(Value, ",", simplify = FALSE)) %>% 
  unnest(Value) %>% 
  filter(str_detect(Value, "email")) %>% 
  mutate(Value = paste0("{",Value,"}"))
库(tidyverse)
df%
as_tible()%>%
变异(值=str_sub(值,2,-2),
Value=str_split(Value,,,simplify=FALSE))%>%
unnest(值)%%>%
过滤器(str_detect(值,“email”))%>%
变异(值=paste0(“{”,值“}”))

我使用的是@Duck的答案中的数据结构。

首先,它看起来是来自JSON数据,可能最好在首次加载时正确解析它。试试这个包
jsonlite

代替此操作,您可以尝试以下方法删除手机数据:

library(tidyverse)

df <- structure(list(ID = c(1, 2, 3, 4), Value = c("{\"user_id\":112312}", 
                                                   "{\"email\":#####@gmail.com, \"phone\":#######578}", "{\"email\":#####@gmail.com}", 
                                                   "{\"user_id\":234242}")), class = "data.frame", row.names = c(NA, -4L))

df %>% 
  as_tibble() %>% 
  mutate(Value = str_sub(Value, 2, -2),
         Value = str_split(Value, ",", simplify = FALSE)) %>% 
  unnest(Value) %>% 
  filter(str_detect(Value, "email")) %>% 
  mutate(Value = paste0("{",Value,"}"))
库(tidyverse)
df%
as_tible()%>%
变异(值=str_sub(值,2,-2),
Value=str_split(Value,,,simplify=FALSE))%>%
unnest(值)%%>%
过滤器(str_detect(值,“email”))%>%
变异(值=paste0(“{”,值“}”))

我使用的数据结构来自@Duck的答案。

这是否回答了您的问题?这回答了你的问题吗?