根据参与者在 R 中的交互频率对参与者进行子集化

Subsetting participants based on their frequency of interactions in R

我对使用 R 比较陌生,所以如果我的问题需要一个非常明显的答案,请提前致歉!我的工作涉及处理事件日志,目前我正在尝试根据客户与服务的交互次数对客户进行子集化。这是一个说明性的例子:-

Client ID               Event
7749-2388              hei856 
4553-9903              jje783 
3423-8850              iew456
3423-8850              msk111
4553-9903              hjl009 
4553-9903              kii906

如您所见,客户端 4553-9903 与服务进行了三种不同的交互,客户端 3423-8850 与服务进行了两种不同的交互,最后客户端 7749-2388 仅进行了一次交互。我的目标是根据与服务的交互量对客户端进行子集化,因此那些具有 N 交互的客户端每个都在一个 data.frame 中。我的问题是我正在使用的 data.frame 有 150,000 行不同的交互,相当于大约 50,000 个唯一客户端,因此像这样手动输入每个单独的客户端 ID 并不可行:

subset(df, Client ID=="4553-9903")

有没有办法对我的数据进行子集化,以便所有与服务进行过 3 次交互的客户都在一个 data.frame 中,依此类推?我希望我的问题不会太难理解,如果我能得到任何帮助,我将不胜感激,谢谢!!

我建议将数据子集存储在 list 中(您将拥有完整的 *apply/purrr::*map 系列方法来处理 list元素).

这里有一个tidyverse选项

library(tidyverse)
df %>%
    group_by(Client.ID) %>%
    mutate(n = n()) %>%
    split(., .$n) %>%
    map(~.x[, 1:2])
#$`1`
## A tibble: 1 x 2
## Groups:   Client.ID [1]
#  Client.ID Event
#  <fct>     <fct>
#1 7749-2388 hei856
#
#$`2`
## A tibble: 2 x 2
## Groups:   Client.ID [1]
#  Client.ID Event
#  <fct>     <fct>
#1 3423-8850 iew456
#2 3423-8850 msk111
#
#$`3`
## A tibble: 3 x 2
## Groups:   Client.ID [1]
#  Client.ID Event
#  <fct>     <fct>
#1 4553-9903 jje783
#2 4553-9903 hjl009
#3 4553-9903 kii906

解释:我们按 Client.ID 对条目进行分组,计算每个 Client.ID 的条目数,并根据该计数将数据拆分为子集。 list 条目的名称对应于 Client.ID 的多重性。

也许我可以通过 Client.ID 而不是 Client.ID 的多重性来分割数据,然后对相应的 list.

进行操作

示例数据

df <- read.table(text =
    "'Client ID'               Event
 7749-2388              hei856
 4553-9903              jje783
 3423-8850              iew456
 3423-8850              msk111
 4553-9903              hjl009
 4553-9903              kii906", header = T)

一个简单的解决方案是

df2<- read.csv("stack_frequency_multi_df.csv",stringsAsFactors = F) #your data
str(df2)
df2$frequency<- as.numeric(ave(df2$client_id,df2$client_id,FUN = length)) ##this will create frequency based on client id 

out <- split( df2 , f = df2$frequency) ##based on the frequency of the client id it will create multiple lists.
list2env(out,envir=.GlobalEnv) ##this will create data frame from all the lists created above 
#below function will save every list as a CSV file which will make your work easier 
Map(write.csv,out,filenames,row.names = F)

希望对你有帮助