подмножество df в соответствии с вложенным списком, в то время как есть пробел - PullRequest
1 голос
/ 03 июля 2019

У меня есть фрейм данных, и я хотел бы установить его в соответствии с конкретными значениями. Когда я попытался это сделать, возникла проблема из-за пробелов внутри значений в sample_df$mentions.

Я использовал этот скрипт для поднабора фрейма данных:

sample_list <- list()
for (i in colnames(sample_name)){
  sample_list <- sapply(sample_df$mentions, function(x)any(x %in% sample_name[[i]]))
  new_sample_df <- sample_df[sample_list,]
}

Я пробовал функцию strsplit, чтобы избавиться от места, но это создало другие проблемы.

sample_df$mentions <- strsplit(as.charater(sample_df$mentions),"[[:space:]]") 

Заранее благодарю за помощь.

Мой ожидаемый результат должен быть таким:

                                                            mentions  screen_name
5          islambey1453,  hamzayerlikaya,  tahaayhan,  hidoturkoglu15  ak_Furkan54
10 nurhandnci,  SSSBBL777,  serkanacar007,  Chequevera06,  kubilayy81 tanrica_gaia

Воспроизводимые данные образца_имя:

sample_name <- structure(list(Name = structure(2:1, .Label = c("hamzayerlikaya", 
                                                               "SSSBBL777"), class = "factor")), row.names = c(NA, -2L), class = "data.frame")

sample_df Воспроизводимые данные:

sample_df <- structure(list(mentions = list(character(0), "srgnsnmz92", character(0), 
                               "Berivan_Aslan_", c("islambey1453", " hamzayerlikaya", " tahaayhan", 
                                                   " hidoturkoglu15"), character(0), "themarginale", character(0), 
                               character(0), c("nurhandnci", " SSSBBL777", " serkanacar007", 
                                               " Chequevera06", " kubilayy81")), screen_name = c("SaadetYakar", 
                                                                                                 "beraydogru", "EL_Turco_DLC", "hebunagel", "ak_Furkan54", "zaferakyol011", 
                                                                                                 "melmitem", "mobbingabla", "BekarKronik", "tanrica_gaia")), row.names = c(NA, 
                                                                                                                                                                           10L), class = "data.frame")

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Мы можем перебрать 'Name' и использовать его в grepl, Reduce к одному логическому вектору и подставить строки 'sample_df'

sample_df[Reduce(`|`, lapply(as.character(sample_name$Name), 
      grepl, x = sample_df$mentions)),]
#                                                           mentions  screen_name
#5          islambey1453,  hamzayerlikaya,  tahaayhan,  hidoturkoglu15  ak_Furkan54
#10 nurhandnci,  SSSBBL777,  serkanacar007,  Chequevera06,  kubilayy81 tanrica_gaia

ПРИМЕЧАНИЕ. Это будет работатьс любым length столбца «Имя»


Другой вариант - regex_inner_join

library(fuzzyjoin)
library(tidyverse)
regex_inner_join(sample_df, sample_name, by = c("mentions" = "Name")) %>% 
      select(mentions, screen_name)
#                                                          mentions  screen_name
#1         islambey1453,  hamzayerlikaya,  tahaayhan,  hidoturkoglu15  ak_Furkan54
#2 nurhandnci,  SSSBBL777,  serkanacar007,  Chequevera06,  kubilayy81 tanrica_gaia
1 голос
/ 03 июля 2019

Поскольку mentions - это список, мы можем использовать sapply и выбирать только те строки в sample_df, где any из mentions содержит Name.

sample_df[sapply(sample_df$mentions, function(x) any(grepl(pattern, x))), ]

#                                                             mentions  screen_name
#5          islambey1453,  hamzayerlikaya,  tahaayhan,  hidoturkoglu15  ak_Furkan54
#10 nurhandnci,  SSSBBL777,  serkanacar007,  Chequevera06,  kubilayy81 tanrica_gaia

, где pattern равно

pattern = paste0("\\b", sample_name$Name, "\\b", collapse = "|")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...