在R中计算焦点实例前的唯一值:生成response1与response2变量
生成response1和response2变量的解决方案
测试数据
"dyad"指讨论帖子(post)中进行对话的两人组(每行代表一条消息),观测值按时间顺序排列。
structure(list(post = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3), dyad = c("111_222", "111_222", "111_222", "222_345", "333_567", "333_899", "333_990", "435_123", "435_555", "435_123", "435_111", "435_555")), class = "data.frame", row.names = c(NA, -12L ), codepage = 65001L)
需求说明
需要创建两个变量:
- response1:同一post中,当前行之前出现的、与当前dyad不同的唯一dyad的数量。
- response2:当前dyad在同一post中的出现顺序(按时间排序)。
期望输出
+------+---------+-----------+-----------+ | post | dyad | response1 | response2 | +------+---------+-----------+-----------+ | 1 | 111_222 | 0 | 1 | +------+---------+-----------+-----------+ | 1 | 111_222 | 0 | 2 | +------+---------+-----------+-----------+ | 1 | 111_222 | 0 | 3 | +------+---------+-----------+-----------+ | 1 | 222_345 | 1 | 4 | +------+---------+-----------+-----------+ | 2 | 333_567 | 0 | 1 | +------+---------+-----------+-----------+ | 2 | 333_899 | 1 | 2 | +------+---------+-----------+-----------+ | 2 | 333_990 | 2 | 3 | +------+---------+-----------+-----------+ | 3 | 435_123 | 0 | 1 | +------+---------+-----------+-----------+ | 3 | 435_555 | 1 | 2 | +------+---------+-----------+-----------+ | 3 | 435_123 | 1 | 3 | +------+---------+-----------+-----------+ | 3 | 435_111 | 2 | 4 | +------+---------+-----------+-----------+ | 3 | 435_555 | 2 | 5 | +------+---------+-----------+-----------+
解决方案
使用dplyr包可以快速实现需求,代码如下:
library(dplyr) # 加载测试数据 df <- structure(list(post = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3), dyad = c("111_222", "111_222", "111_222", "222_345", "333_567", "333_899", "333_990", "435_123", "435_555", "435_123", "435_111", "435_555")), class = "data.frame", row.names = c(NA, -12L ), codepage = 65001L) # 生成目标变量 df_result <- df %>% group_by(post) %>% mutate( # response2:同一post内的时间顺序行号 response2 = row_number(), # response1:当前行前出现的、与当前dyad不同的唯一dyad数量 response1 = sapply(row_number(), function(i) { prev_dyads <- dyad[1:(i-1)] length(unique(prev_dyads[prev_dyads != dyad[i]])) }) ) %>% ungroup() # 输出结果 print(df_result, row.names = FALSE)
运行代码后得到的结果与期望输出完全一致。
内容的提问来源于stack exchange,提问作者user14250906
相关产品推荐
相关产品推荐

