跟踪不同数据集的观察结果(例如 sub-reddits)

Tracking observations across different datasets (e.g. sub-reddits)

我有来自三个不同子版块的三个数据集,我的目标是 1-检查有多少用户在 df1(即子版块)中活跃,在 df2 中活跃,and/or df3(即另一个 subreddit)。 另一个目标是,一旦我合并了所有数据集,我就能知道每个用户的 post 写在哪个子版块中。例如,我想知道用户 X 在子版块 2 和 3 中是否活跃,但在子版块 1 中不活跃。用户 Y 在子版块 1 和 3 中活跃,但在子版块 2 中不活跃。

在每个数据集中,我有如下所示的 3 个变量:

post   date        username

这里是 df1 的样本

post   date          username
xyz    1-03-2016     crashbash
mnz   1-03-2016      crashbash
mnc   1-03-2016      crashbash

这里是 df2 的样本

post   date          username
yzh  1-05-2016      crashbash
wzh  1-05-2016      costanza89
zya  1-05-2016      costanza89

这里是 df3 的样本

post   date             username
Fleabag is bad          1-05-2016      costanza89
southpark is the bestt!  1-08-2016      crashbash
fleabag is ok           1-08-2016      skunk49

这是我的代码:

#Clearing out environment
rm(list = ls())
#Loading packages
library(tidyverse)
library(readxl)
library(writexl)
library(quanteda)
library(stringr)
library(textclean)
library(lubridate)
library(zoo)
## importing 3 datasets
df1 <- read_excel("df1.xlsx")
df2 <- read_excel("df2.xlsx")
df3 <- read_excel("df3.xlsx")

我目前写了下面的代码,它运行良好,但它只告诉我给定的用户是否在给定的 sub-reddit 中有多个 post,但它没有区分用户在一个 sub-reddit 中有多个 post,而那些在多个 sub-reddit 中活跃的人。我主要对后一组感兴趣

all_subreddits <-
  bind_rows(df1,df2,df3,.id = "origin") %>% 
  group_by(username) %>% 
  mutate(active = +(n_distinct(origin) == 2), .keep = "unused")

在上面的代码之后,数据如下所示,其中 active= 1 如果用户出现不止一次,否则为 0。

sapply(all_subreddits, class)
       post        date    username      active 
"character" "character" "character"   "integer" 

然而,理想情况下,我希望得到以下结果,其中包含一个变量,指示每个用户活跃的子版块:

post              date           username               active
xyz               1-03-2016     crashbash         in df1 & df2
zya               1-05-2016      costanza89       in df1 and df3
fleabag is ok     1-08-2016      skunk49          in df3

在运行下面提出的很好的解决方案之后,我得到以下输出:

sapply(all_subreddits, class)
 origin        post        date    username 
"character" "character"      "Date" "character"
print(all_subreddits)
A tibble: 1,037 x 4
   origin post                                                               date   username    
   <chr>  <chr>                                                              <date> <chr>       
748
df2
الشكوى لله ذلونا صراحه
27-09-2012
هتلر المخاريم
678
df2
اقتباس: المشاركة الأصلية كتبت بواسطة حظها العاثر (المشاركة 6775851) ^ والله صادقه يا اختي حسبي الله ونعم الوكيل انا واختي الشئ نفسه غير مؤهلين عشان راتب بابا التقاعدي الله يرحمه والله ظلم :( حسبي الله عليهم انا وخواتي مثلك يارب ياخذ حقنا منهم بالدنيا قبل الآخرة 
23-09-2012
هتانه
679
df2
اقتباس: المشاركة الأصلية كتبت بواسطة بنت القنفذة (المشاركة 6811014) خلاص ماعاد فيه خوف من الله الطمع اعمى عيونهم حسبي الله عليهم اللهم عليك بالظالمين فإنهم لايعجزونك يارب خذ بحقنااا اللهم إنا مظلومون فأنتصر لنا يااااارب والله مقهوووووره يكفي اننا ايتام حرااااام عليهم الله مايرضى بالظلم امين يارب
23-09-2012
هتانه
936
df3
مشكوووووووووووور وماقصرت .
22-01-2012
هانيبال ليكتر
450
df2
نفس الطريقه انا غير مؤهله بسبب راتب التقاعد بس اللي ابغى افهمه احنا ورثه ونصرف على البيت من الراتب على بالهم انو دخل ثابت لنا خاص !!! طيب عاطلين احنا مالنا شي !!
11-09-2012
هاربر
452
df2
^^ الدعوه كلها اذلال والله ذلونا على الـ 2000 المنحوسه !!
11-09-2012
هاربر

合并数据后,我尝试了 R 基础解决方案,它完美运行!

xtabs( ~ username + origin, hafiz1_combined)

输出:

    origin
username           df1 df2 df3
  Ξ الأدميرالي Ξ     1   0   0
  آ فوفه             0   0   1
  آبو طيف            0   0   3
  آر اندرويد         0   0   1
  آلبدر              0   2   0

这里有 tidyverse 两个目标的解决方案。

x <- "
post   date          username
xyz    1-03-2016     crashbash
mnz   1-03-2016      crashbash
mnc   1-03-2016      crashbash"
y <- "post   date          username
yzh  1-05-2016      crashbash
wzh  1-05-2016      costanza89
zya  1-05-2016      costanza89"
z <- "post   date             username
'Fleabag is bad'          1-05-2016      costanza89
'southpark is the best!'  1-08-2016      crashbash
'fleabag is ok'           1-08-2016      skunk49"

df1 <- read.table(textConnection(x), header = TRUE)
df2 <- read.table(textConnection(y), header = TRUE)
df3 <- read.table(textConnection(z), header = TRUE)

suppressPackageStartupMessages(library(tidyverse))

all_subreddits <- bind_rows(df1, df2, df3, .id = "origin") %>%
  mutate(origin = paste0("df", origin),
         date = as.Date(date, "%m-%d-%Y"))

all_subreddits %>% 
  group_by(origin) %>%
  summarise(n_users = n_distinct(username))
#> # A tibble: 3 × 2
#>   origin n_users
#>   <chr>    <int>
#> 1 df1          1
#> 2 df2          2
#> 3 df3          3

all_subreddits %>%
  group_by(username) %>%
  summarise(active = paste(unique(origin), collapse = ", "))
#> # A tibble: 3 × 2
#>   username   active       
#>   <chr>      <chr>        
#> 1 costanza89 df2, df3     
#> 2 crashbash  df1, df2, df3
#> 3 skunk49    df3

reprex package (v2.0.1)

于 2022-05-07 创建

基础 R

也有基本的 R 解决方案,在 all_subreddits 中有数据后非常简单,但输出格式不同。

aggregate(origin ~ username, all_subreddits, \(x) c(unique(x)))
#>     username        origin
#> 1 costanza89      df2, df3
#> 2  crashbash df1, df2, df3
#> 3    skunk49           df3

xtabs( ~ username + origin, all_subreddits)
#>             origin
#> username     df1 df2 df3
#>   costanza89   0   2   1
#>   crashbash    3   1   1
#>   skunk49      0   0   1

reprex package (v2.0.1)

于 2022-05-07 创建