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

标签 r merge tidyverse

我有来自三个不同 sub-reddit 的三个数据集,我的目标是 1 - 检查有多少用户活跃在 df1(即 sub-reddit)、活跃在 df2 和/或 df3(即另一个 subreddit)中。 另一个目标是,一旦合并所有数据集,我就能够知道每个用户的帖子是在哪个 Reddit 子版 block 中编写的。例如,我有兴趣知道用户 X 是否在子 Reddits 2 和 3 中活跃,但在子 Reddits 1 中不活跃。用户 Y 在子 Reddits 1 和 3 中活跃,但在子 Reddits 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")

我目前编写了下面的代码,该代码运行良好,但它只告诉我给定用户是否在给定的 Reddit 子版 block 中拥有多个帖子,但它并没有区分在一个子版 block 中拥有多个帖子的用户-reddit,与那些活跃于多个 Reddit 子版 block 的人相比。我主要对学习后一组感兴趣。

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" 

但是,理想情况下,我希望得到以下结果,其中有一个变量指示每个用户活跃的子 Reddit:

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于2022年5月7日创建(v2.0.1)


基础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于2022年5月7日创建(v2.0.1)

关于r - 跟踪不同数据集的观察结果(例如 sub-reddits),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72151928/

相关文章:

r - 将第二个标题添加到基于极坐标的 ggplot2 图

r - 使用 "data.table"包合并数据帧时出错

vba - 如何在VBA中合并两个集合?

r - 将冒号运算符或破折号从字符强制转换为 r 中单元格内的向量

r - 如何使用 dplyr 管道拆分字符串和计算字母频率

R 列用数据框中的其他列替换字母表

c# - 我可以在不安装 R 的情况下使用 R.Net 吗?

r - 如何计算连续累积和?

r - 在字符串中搜索 unicode 值

git - 使用 Git,是否可以重新应用祖先版本?