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

R 基于嵌套数据帧中的列表的子集,r,dataframe,subset,R,Dataframe,Subset,我希望通过评估由列表组成的列中的一个元素是否是另一个dataframe变量的一部分来子集dataframe 具体地说,我有一个大约200000条tweet的数据集(通过rtweet获取),我希望该数据集只包含在样本中包含10个hashtag中的一个(或多个)的tweet。这10个hashtags是样本中最经常同时出现的,存储在hashtags\u top中 通常的子集划分方法不起作用(也就是说,它们给出了无意义的结果)。我已经尝试在几种子集技术中使用%中的%in%: tweets_tops &l

我希望通过评估由列表组成的列中的一个元素是否是另一个dataframe变量的一部分来子集dataframe

具体地说,我有一个大约200000条tweet的数据集(通过
rtweet
获取),我希望该数据集只包含在样本中包含10个hashtag中的一个(或多个)的tweet。这10个hashtags是样本中最经常同时出现的,存储在hashtags\u 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)
同样的结果

数据的结构如下[因为这里只关注“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\u top数据帧的结构是简单的两列数据帧的结构,其中Var1包含hashtags,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
我开始相信,通过%中的
%进行评估是不可行的,因为数据帧中有多个元素需要评估。也就是说,只有当恰好有一个hashtag(并且该hashtag是所需子集的一部分)时,它才起作用。因此,我正在寻找一种解决方案,允许检查一行中的任何hashtag是否是top_hashtags的一部分,如果是,则将其包含在子集中


我想一个解决方案是扁平化数据帧、子集和删除重复项,但我希望避免这种情况。也许有一个更容易解决这个问题的方法,但即使环顾四周一段时间,我似乎也找不到它。任何帮助都将不胜感激

这可以使用
dplyr
purrr
完成:

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)  
库(purrr)
图书馆(dplyr)
rt%
选择(哈希标记)%%>%
pmap(~any(c('DataScience','PowerBI')%in%.x))%>%
展平\u lgl%>%
变异(.data=rt,keep=)%>%
过滤器(保持)%>%
选择(-keep)

主要功能是
pmap
,它允许您将函数映射到选定的hashtag列上。如果我们想要的任何标记(在您的例子中是
hashtags\u top$Var1
)在hashtags列中,我们会得到一个真值。我们使用
mutate
filter
将结果绑定到tbl,过滤结果为
TRUE
的行,然后删除临时
keep
列。

您是否介意共享代码以使用
rtweet
获取这些推文,或者至少是一些示例数据?看起来您的数据帧列实际上是一个由196987个元素组成的列表,而不是一个原子向量。Bob在下面给出了一个关于如何获取数据的好例子。既然已经解决了,我现在就不提供示例数据。不过,rtweet对于挖掘tweet非常有用。此外,@Parfait,作为列表的列似乎不是问题所在,因为取消列出它并没有解决问题。问题在于原始数据帧行中有多个元素,每个元素都需要求值。这就是为什么pmap()是必要的(见下文)太棒了,太棒了!非常感谢。我想我必须更多地研究这些映射函数,它们似乎不时派上用场。我注意到您需要注意%in%区分大小写。也就是说,对于hashtag来说,将它们全部转换为小写(或大写)来解释不规则性是有意义的。确保使用sappy()获得正确的结果(如果有人有相同的问题):sappy(tweets$hashtags,tolower)
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)