我有来自三个不同 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/