提问人:thedumbkid 提问时间:8/29/2023 最后编辑:thedumbkid 更新时间:8/30/2023 访问量:36
R 中学生的交互效应
Interaction Effects of Students in R
问:
我正在 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 ...
...
答:
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)
评论