学生在R中的互动效果

问题描述 投票:0回答:1

我正在使用 R 中的数据集 df1。它有两列:日期和学生 ID。我首先想找出在某个日期一起出现的学生对的数量。假设这些学生对位于 V 列中。现在我想创建一个包含 V 列的数据框,以便对应于每个日期,如果这对学生出现在同一日期,则每列下都有 0 或 1。我在编写这段代码时遇到了麻烦,因为它是一个相当复杂的数据操作。

这就是数据框的样子:

> head(pair_combinations, 20)
# A tibble: 20 × 2
    DATE STUDENT_ID
      <int> <chr>      
 1 21500001 203145     
 2 21500001 200794     
 3 21500001 201143     
 4 21500001 2594       
 5 21500001 201952     
 6 21500001 200757     
 7 21500001 203934     
 8 21500001 203471     
 9 21500001 203488     
10 21500001 203118     
11 21500019 203145     
12 21500019 200794     
13 21500019 201143     
14 21500019 2594       
15 21500019 201952     
16 21500019 203471     
17 21500019 203934     
18 21500019 203118     
19 21500019 203501     
20 21500026 203145

我想要这样的输出:

    DATE INTERACTION_203145_200794 INTERACTION_203145_201143 ...
      <int> <chr>      
 1 21500001          1                          1 
 2 21500019          1                          1 ...
...
r dataframe pivot data-manipulation
1个回答
1
投票

这不太漂亮,但我猜这可能有用

首先,一个辅助函数来获取所有值对

all_pairs<-function(x) {
  if (length(x) >= 2) {
    sapply(combn(sort(unique(x)),2, simplify=FALSE), paste, collapse="_")
  } else {
    NA
  }
}

我们对值进行排序,以便较小的 ID 始终排在前面,这样我们就不会重复对(它始终是 A_B 而不是 B_A)。

现在我们可以做一些重塑

library(dplyr)
library(tidyr)

dd %>% 
  group_by(DATE) %>% 
  reframe(intx = all_pairs(STUDENT_ID)) %>% 
  mutate(val = 1) %>% 
  pivot_wider(names_from = intx, values_from = val, values_fill = 0)

测试

dd <- read.table(text="
    DATE STUDENT_ID
 1 21500001 203145     
 2 21500001 200794     
 3 21500001 201143     
 4 21500001 2594       
 5 21500001 201952     
 6 21500001 200757     
 7 21500001 203934     
 8 21500001 203471     
 9 21500001 203488     
10 21500001 203118     
11 21500019 203145     
12 21500019 200794     
13 21500019 201143     
14 21500019 2594       
15 21500019 201952     
16 21500019 203471     
17 21500019 203934     
18 21500019 203118     
19 21500019 203501     
20 21500026 203145", header=TRUE)
© www.soinside.com 2019 - 2024. All rights reserved.