基于嵌套数据框中的列表的子集

时间:2019-02-07 18:38:09

标签: r dataframe subset

我正在通过评估由列表组成的列中的元素之一是否为另一个数据框变量的一部分来对数据框进行子集化。

具体来说,我有一个约200,000条推文的数据集(通过rtweet获取),我希望将其子集化,以仅包含示例中包含10个标签中的一个(或多个)的推文。这10个标签是样本中最频繁使用的标签,存储在hashtags_top中。

通常的子集方法不起作用(也就是说,它们给出了荒谬的结果)。我尝试过在几种子设置技术中使用%in%

tweets_tops <- subset(tweets, hashtags %in% hashtags_top$Var1)
tweets_tops <- tweets[tweets$hashtags %in% hashtags_top$Var1,]
tweets_tops <- filter(tweets, hashtags %in% hashtags_top$Var1)

他们都给出了112条推文的相同子集,这显然是不正确的,考虑到单独的热门标签已超过11.000条推文。我还尝试通过

取消列出tweets $ hashtags列
   vapply(tweets$hashtags, paste, collapse = ", ", character(1L))

具有相同的结果。

数据的结构如下所示[由于这里仅涉及“ hashtag”列,因此我仅将其包括在内)。

str(tweets$hashtags)
List of 196987
 $ : chr [1:4] "Professional" "dynamic" "website" "development"
 $ : chr NA
 $ : chr [1:4] "Professional" "dynamic" "website" "development"
 $ : chr "MeTwo"
....

用于子集的hashtags_top数据帧的结构是一个简单的两列数据帧的结构,其中Var1包含井号,而Freq包含其频率:

str(hashtags_top)
'data.frame':   10 obs. of  2 variables:
 $ Var1: chr  "deutschland" "nsu" "mequeer" "kochallenge" ...
 $ Freq: int  1691 1862 2359 2372 2756 2853 3773 3900 8292 11745

我已经开始相信通过%in%进行的评估是行不通的,因为事实是数据框中有多个要评估的元素。也就是说,仅当正好有一个井号标签(并且该井号是所需子集的一部分)时,它才起作用。因此,我正在寻找一种解决方案,该方法可以检查一行中的任何主题标签是否是top_hashtags的一部分,如果是,则将其包含在子集中。

我想一种解决方案是展平数据框,子集并删除重复项-但我想避免这种情况。解决这个特定问题的方法可能更简单,但是即使环顾了很长时间,我似乎也找不到它。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这可以使用dplyrpurrr来完成:

library(purrr)
library(dplyr)
rt <- search_tweets("#rstats", n = 180, include_rts = FALSE)
rt %>% 
    select(hashtags)  %>%
    pmap(~any(c('DataScience','PowerBI') %in% .x)) %>% 
    flatten_lgl %>%  
    mutate(.data=rt, keep=.) %>%  
    filter(keep) %>%  
    select(-keep)  

主力是pmap,它使您可以在选定的主题标签列上映射功能。如果我们想要的任何标签(在您的情况下为hashtags_top$Var1)在#标签列中,我们将获得一个真值。我们使用mutatefilter结果为TRUE的行将结果绑定到tbl,然后删除临时keep列。