r - 检查 R 中跨波的多个列中的重叠
问题描述
我有一个超过 5 波的青少年数据集。在每一波中,他们最多提名 3 位朋友。我想添加变量来指示每个朋友是否在上一波数据收集中被提名。
我的数据看起来像这个样本:
student_id wave friend1_id friend2_id friend3_id
1 1 3 NA NA
2 1 5 2 3
3 1 2 4 5
4 1 1 6 NA
5 1 1 NA 6
6 1 5 NA 2
7 1 8 NA NA
8 1 NA 9 NA
9 1 8 7 NA
10 1 7 9 NA
1 2 4 NA NA
2 2 5 3 NA
3 2 NA NA 5
4 2 NA NA NA
5 2 6 NA NA
6 2 5 NA NA
7 2 10 1 3
8 2 9 NA NA
9 2 8 6 7
10 2 7 4 NA
因此,第 2 波“一致性”变量应如下所示(前一波中不存在 0,但在前一波中存在,如果他们没有在第 2 波中提名某人,则为 NA):
student_id wave friend1_consit friend2_consit friend3_consit
1 2 0 NA NA
2 2 1 1 NA
3 2 NA NA 1
4 2 NA NA NA
5 2 1 NA NA
6 2 1 NA NA
7 2 0 0 0
8 2 1 NA NA
9 2 1 2 1
10 2 1 0 NA
解决方案
这个答案Base-R
返回一个矩阵,其中 student_id 作为行,wave# 作为列:
votes_bywave <- split(df1[,3:5],df1$wave)
votes_bywave <- lapply(votes_bywave, function(x) unique(unlist(x)))
votes_bywave <- sapply(votes_bywave, function(x) unique(df1$student_id) %in% x )
> votes_bywave
1 2
[1,] TRUE TRUE
[2,] TRUE FALSE
[3,] TRUE TRUE
[4,] TRUE TRUE
[5,] TRUE TRUE
[6,] TRUE TRUE
[7,] TRUE TRUE
[8,] TRUE TRUE
[9,] TRUE TRUE
[10,] FALSE TRUE
或者您可能更喜欢列出实际的 Id,在这种情况下,请在末尾添加以下行:
cbind(student_id = unique(df1$student_id), votes_bywave)
student_id 1 2
[1,] 1 1 1
[2,] 2 1 0
[3,] 3 1 1
[4,] 4 1 1
[5,] 5 1 1
[6,] 6 1 1
[7,] 7 1 1
[8,] 8 1 1
[9,] 9 1 1
[10,] 10 0 1
推荐阅读
- python - 如何实现按住一个键直到执行另一个动作?
- python - 面板数据到字典
- javascript - 如何检索 ID 数组,然后使用它从 React Native 中的 Firestore 检索文档?
- functional-programming - SML:读取一行整数时出现异常
- xpath - XPath:选择多个'following-sibling'
- python - 通过分割图像构建卷积网络
- datetime - Dask - groupby 期间行间时间戳差异的平均值
- javascript - 需要在 JavaScript 中以 5 秒的时间间隔一个一个地渲染 div
- material-ui - Nextjs 与 Material UI
- python - Flask SQLAlchemy ImportError:无法导入表单