根据参与者在R中的互动频率对参与者进行分组

时间:2018-08-14 11:49:26

标签: r filter subset event-log interaction

如果我的问题需要一个非常明显的答案,我对使用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具有15万行不同的交互,这相当于大约50,000个唯一客户端,因此手动键入每个单独的客户端ID确实不是切实可行的,

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

是否有一种方法可以对我的数据进行子集处理,以便所有与该服务进行了3次交互的客户端都位于一个data.frame中,依此类推?我希望我的问题不会太难理解,我能得到的任何帮助将不胜感激,谢谢!!

2 个答案:

答案 0 :(得分:1)

我建议将数据子集存储在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)

答案 1 :(得分:0)

一个简单的解决方案是

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)

我希望对您有帮助