R 中学生的交互效应

Interaction Effects of Students in R

提问人:thedumbkid 提问时间:8/29/2023 最后编辑:thedumbkid 更新时间:8/30/2023 访问量:36

问:

我正在 R 中使用数据集 df1。它有两列:日期和Student_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 数据操作

评论

3赞 MrFlick 8/29/2023
如果包含一个简单的可重现示例,其中包含可用于测试和验证可能的解决方案的示例输入和所需输出,则更容易为您提供帮助。
0赞 thedumbkid 8/29/2023
@MrFlick,谢谢,我现在已经把它包括在内了
1赞 IRTFM 8/29/2023
我认为目标仍然模糊不清。示例数据只是头部,但预期输出不依赖于该子集。您期望我们知道作为列名的三个点中的内容,从而犯下了 MCVE 的主要罪过。您应该将示例数据编辑得更小,并具有一些重复的学生 ID。然后显示所有预期的输出。

答:

1赞 MrFlick 8/29/2023 #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)