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