如果我的问题需要一个非常明显的答案,我对使用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
中,依此类推?我希望我的问题不会太难理解,我能得到的任何帮助将不胜感激,谢谢!!
答案 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)
我希望对您有帮助