根据参与者在 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)
希望对你有帮助
我对使用 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)
希望对你有帮助