如何识别分组内变量存在非NA不同值的个体?
找出个体多观测中存在冲突的变量
核心思路
通过将宽表转为长格式,按个体(Ind)和变量(V1/V2/V3)分组,统计每组内非NA值的唯一数量,筛选出数量大于1的组,即可定位存在冲突的个体和变量。
解决代码
library(tidyverse) # 样例数据 df <- data.frame(Ind=c("C","C","C","B","B"), V1 = c("a",NA,"b","a",NA), V2 = c("b","b",NA,"a","a"), V3 = c(NA,"a","a",NA,"b"), obs.id = c(1,2,3,4,5)) # 定位冲突的个体与变量 conflict_summary <- df %>% pivot_longer(cols = starts_with("V"), names_to = "Variable", values_to = "Value") %>% filter(!is.na(Value)) %>% group_by(Ind, Variable) %>% summarise( 唯一值列表 = list(unique(Value)), 唯一值数量 = n_distinct(Value), .groups = "drop" ) %>% filter(唯一值数量 > 1) # 查看结果 conflict_summary
结果说明
运行后会输出存在冲突的记录,示例结果如下:
# A tibble: 1 × 4 Ind Variable 唯一值列表 唯一值数量 <chr> <chr> <list> <int> 1 C V1 <chr [2]> 2
清晰展示了Ind=C的V1变量存在2个不同的非NA值。
查看冲突的原始观测细节
如果需要查看冲突对应的具体原始数据,可以用以下代码:
df %>% pivot_longer(cols = starts_with("V"), names_to = "Variable", values_to = "Value") %>% filter(!is.na(Value)) %>% inner_join(conflict_summary %>% select(Ind, Variable), by = c("Ind", "Variable")) %>% arrange(Ind, Variable)
输出结果会列出所有冲突的原始观测:
# A tibble: 2 × 4 Ind obs.id Variable Value <chr> <dbl> <chr> <chr> 1 C 1 V1 a 2 C 3 V1 b
内容的提问来源于stack exchange,提问作者ghaines
相关产品推荐
相关产品推荐

