跟踪不同数据集的观察结果(例如 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 创建
我有来自三个不同子版块的三个数据集,我的目标是 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 创建