R:“分组抛币”的计数序列

mrwjdhj3  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(132)

我正在使用R编程语言。
我这里有一个数据集不同的学生抛硬币的次数不同

set.seed(123)
ids = 1:100
student_id = sample(ids, 1000, replace = TRUE)
coin_result = sample(c("H", "T"), 1000, replace = TRUE)
my_data = data.frame(student_id, coin_result)

my_data =  my_data[order(my_data$student_id),]
    • 根据我的数据,我想计算每个学生的"3序列"掷硬币序列数。**

我知道如何一次对整个数据集执行此操作:

# https://stackoverflow.com/questions/74758896/r-counting-the-frequencies-of-coin-flips

results = my_data$coin_result

n_sequences <- function(n, results) {
  helper <- function(i, n) if (n < 1) "" else sprintf(
    "%s%s", 
    helper(i, n - 1), 
    results[i + n - 1]
  )
  result <- data.frame(
    table(
      sapply(
        1:(length(results) - n + 1),
        function(i) helper(i, n)
      )
    )
  )
  colnames(result) <- c("Sequence", "Frequency")
  result
}

n_sequences(3, results)

  Sequence Frequency
1      HHH       140
2      HHT       129
3      HTH       132
4      HTT       119
5      THH       129
6      THT       121
7      TTH       119
8      TTT       109
    • 现在,我尝试执行类似的计算-但针对单个学生-然后对所有学生进行分组。**也就是说,我希望每次有新学生开始掷硬币时"计数器"都重新启动。这样,我就可以找出所有学生单独出现"HHH"的总次数。

我想到了一个非常缓慢和低效的方法来做到这一点:

library(dplyr)

 my_list = list()

for (i in 1:length(unique(ids))) {
    tryCatch({
        frame_i = my_data[my_data$student_id == i,]
        results_i = frame_i$coin_result
        results = results_i
        results_i = n_sequences(3, results)
        final_i = cbind(student_id = i, results_i)
        my_list[[i]] = final_i
        #print(final_i)
    }, error = function(e) {})
}

goal = do.call(rbind.data.frame, my_list)

# EXPECTED OUTPUT
summary = goal %>% group_by(Sequence) %>% summarise(sums = sum(Frequency))

> summary
# A tibble: 8 x 2
  Sequence  sums
  <fct>    <int>
1 HTT         93
2 TTH         93
3 HHH        112
4 HHT        106
5 HTH        108
6 THH         97
7 TTT         94
8 THT         97

即使我的方法是正确的-我有一种感觉,运行这个循环的大数据集(例如,当有超过100万学生ID)将需要很长的时间来运行。

    • 有人能建议一个更有效的方法来解决这个问题吗?**

谢谢!

    • 注意:**如果数据框中的学生序列少于"n"个,例如n_sequences(n =5, results),我不确定n_sequence()函数是否可以工作。这就是为什么我添加了tryCatch()语句来覆盖这种情况。
ymzxtsji

ymzxtsji1#

下面是一些dplyr代码:

library(tidyverse)
my_data %>%
  group_by(student_id) %>%
  summarize(Sequence = str_c(coin_result, lead(coin_result), lead(coin_result, 2)), .groups = 'drop') %>%
  filter(!is.na(Sequence)) %>%
  count(Sequence)

# A tibble: 8 x 2
  Sequence     n
  <chr>    <int>
1 HHH        112
2 HHT        106
3 HTH        108
4 HTT         93
5 THH         97
6 THT         97
7 TTH         93
8 TTT         94

相关问题