在R中统计多变量分散观测值并生成二元指示变量
解决方案:树种观测统计与二元变量转换
我们可以借助tidyverse包中的dplyr和tidyr工具解决这个问题,避开unite函数处理NA值的麻烦,通过格式转换直接实现需求:
1. 统计每种树种的观测数量
将宽格式数据转为长格式,剔除NA值后按树种统计出现次数:
library(tidyverse) # 统计树种观测数量 tree_counts <- treedata %>% # 将Tree_1到Tree_4列转为长格式 pivot_longer(cols = starts_with("Tree_"), names_to = "tree_order", values_to = "species") %>% # 去掉树种为NA的无效记录 drop_na(species) %>% # 按树种计数 count(species, name = "observation_count") # 查看结果 print(tree_counts)
运行结果:
species observation_count 1 alder 3 2 birch 3 3 oak 4 4 sequoia 3
2. 生成二元变量(Yes/No)数据框
先转长格式去重,再转回宽格式,标记每个ID是否发现过对应树种,未发现的填充为No:
# 生成二元变量数据框 tree_binary <- treedata %>% pivot_longer(cols = starts_with("Tree_"), names_to = "tree_order", values_to = "species") %>% drop_na(species) %>% # 确保每个ID和树种只保留一条记录(避免重复标记) distinct(ID, species) %>% mutate(present = "Yes") %>% # 转回宽格式,缺失的树种填充为No pivot_wider(names_from = species, values_from = present, values_fill = "No") %>% # 关联原数据的ID列,保证所有ID都被保留 left_join(treedata %>% select(ID), ., by = "ID") # 查看结果 print(tree_binary)
运行结果:
ID alder birch oak sequoia 1 1 Yes Yes Yes Yes 2 2 No No Yes Yes 3 3 Yes Yes Yes No 4 4 Yes Yes Yes Yes
补充说明
unite函数更适合合并文本列,对于这类需要去重、处理NA的格式转换场景,转长格式处理再转回宽格式的流程更直接:既能高效过滤无效的NA记录,又能确保每个ID的树种标记唯一,避免重复计数或错误标记。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

